Sat, 09 Dec 2017 18:32:08 +0100
Added the pip interface plug-in to the core plug-ins.
--- a/APIs/Python3/eric6.api Sat Dec 09 17:43:24 2017 +0100 +++ b/APIs/Python3/eric6.api Sat Dec 09 18:32:08 2017 +0100 @@ -1556,6 +1556,7 @@ eric6.E5XML.Config.multiProjectFileFormatVersion?7 eric6.E5XML.Config.pluginRepositoryFileFormatVersion?7 eric6.E5XML.Config.projectFileFormatVersion?7 +eric6.E5XML.Config.projectFileFormatVersionAlt?7 eric6.E5XML.Config.sessionFileFormatVersion?7 eric6.E5XML.Config.shortcutsFileFormatVersion?7 eric6.E5XML.Config.tasksFileFormatVersion?7 @@ -4378,6 +4379,36 @@ eric6.Plugins.PluginEricdoc.python2Compatible?7 eric6.Plugins.PluginEricdoc.shortDescription?7 eric6.Plugins.PluginEricdoc.version?7 +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.PreferencesKey?7 +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.activate?4() +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.currentPipChanged?7 +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.deactivate?4() +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getDefaultPipExecutables?4() +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getMenu?4(name) +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getMenuNames?4() +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.getPreferences?4(key) +eric6.Plugins.PluginPipInterface.PipInterfacePlugin.setPreferences?4(key, value) +eric6.Plugins.PluginPipInterface.PipInterfacePlugin?1(ui) +eric6.Plugins.PluginPipInterface._findDefaultExecutables?5(majorVersion) +eric6.Plugins.PluginPipInterface.author?7 +eric6.Plugins.PluginPipInterface.autoactivate?7 +eric6.Plugins.PluginPipInterface.className?7 +eric6.Plugins.PluginPipInterface.createPipPage?4(configDlg) +eric6.Plugins.PluginPipInterface.deactivateable?7 +eric6.Plugins.PluginPipInterface.error?7 +eric6.Plugins.PluginPipInterface.exeDisplayDataList?4() +eric6.Plugins.PluginPipInterface.getConfigData?4() +eric6.Plugins.PluginPipInterface.getExePath?4(branch, access, versionStr) +eric6.Plugins.PluginPipInterface.longDescription?7 +eric6.Plugins.PluginPipInterface.name?7 +eric6.Plugins.PluginPipInterface.needsRestart?7 +eric6.Plugins.PluginPipInterface.packageName?7 +eric6.Plugins.PluginPipInterface.pipPluginObject?7 +eric6.Plugins.PluginPipInterface.prepareUninstall?4() +eric6.Plugins.PluginPipInterface.pyqtApi?7 +eric6.Plugins.PluginPipInterface.python2Compatible?7 +eric6.Plugins.PluginPipInterface.shortDescription?7 +eric6.Plugins.PluginPipInterface.version?7 eric6.Plugins.PluginSyntaxChecker.SyntaxCheckerPlugin.activate?4() eric6.Plugins.PluginSyntaxChecker.SyntaxCheckerPlugin.deactivate?4() eric6.Plugins.PluginSyntaxChecker.SyntaxCheckerPlugin?1(ui) @@ -4688,6 +4719,73 @@ eric6.Plugins.PluginWizardQRegularExpression.python2Compatible?7 eric6.Plugins.PluginWizardQRegularExpression.shortDescription?7 eric6.Plugins.PluginWizardQRegularExpression.version?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage.on_addButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage.on_defaultListButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage.save?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.PipPage?1(plugin) +eric6.Plugins.UiExtensionPlugins.PipInterface.DefaultIndexUrl?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.getMenu?4(name) +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.getMenuNames?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.initActions?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.initMenu?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.installPackages?4(packages, cmd="") +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.runProcess?4(args, cmd="") +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.uninstallPackages?4(packages, cmd="") +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.upgradePackages?4(packages, cmd="") +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip.upgradePip?4(pip="") +eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.Pip?1(plugin, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.closeEvent?4(e) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.on_buttonBox_clicked?4(button) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.startProcess?4(cmd, args, showArgs=True) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog.startProcesses?4(processParams) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.PipDialog?1(text, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.closeEvent?4(e) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_buttonBox_clicked?4(button) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_copyButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_fileButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_insertButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_localCheckBox_clicked?4(checked) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_pipComboBox_activated?4(txt) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_replaceAllButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_replaceSelectionButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_requirementsEdit_textChanged?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_requirementsFileEdit_textChanged?4(txt) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_saveButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.on_saveToButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog.start?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.PipFreezeDialog?1(pip, plugin, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.CommandArguments?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessClassifiersMode?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessEntryPointsMode?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessFilesListMode?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.ShowProcessGeneralMode?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.closeEvent?4(e) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_buttonBox_clicked?4(button) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_installedFilesCheckBox_clicked?4(checked) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_localCheckBox_clicked?4(checked) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_notRequiredCheckBox_clicked?4(checked) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_packageList_itemSelectionChanged?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_pipComboBox_activated?4(txt) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.on_verboseCheckBox_clicked?4(checked) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog.start?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.PipListDialog?1(pip, mode, plugin, title, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.PipPackageDetailsDialog?1(detailsData, downloadsData, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.PipPackagesInputDialog.getData?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.PipPackagesInputDialog.on_packagesEdit_textChanged?4(txt) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.PipPackagesInputDialog?1(plugin, title, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog.getData?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog.on_fileButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog.on_requirementsEdit_textChanged?4(txt) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.PipRequirementsSelectionDialog?1(plugin, parent=None) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.Stopwords?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.VersionRole?7 +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.closeEvent?4(e) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_buttonBox_clicked?4(button) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_resultList_itemActivated?4(item, column) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_resultList_itemSelectionChanged?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_searchButton_clicked?4() +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog.on_searchEdit_textChanged?4(txt) +eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.PipSearchDialog?1(pip, plugin, parent=None) eric6.Plugins.VcsPlugins.vcsMercurial.Config.ConfigHgSchemes?7 eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.on_configButton_clicked?4() eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.MercurialPage.save?4()
--- a/APIs/Python3/eric6.bas Sat Dec 09 17:43:24 2017 +0100 +++ b/APIs/Python3/eric6.bas Sat Dec 09 18:32:08 2017 +0100 @@ -582,6 +582,16 @@ PathGraphingAstVisitor ASTVisitor PersonalDataDialog QDialog Ui_PersonalDataDialog PersonalInformationManager QObject +Pip QObject +PipDialog QDialog Ui_PipDialog +PipFreezeDialog QDialog Ui_PipFreezeDialog +PipInterfacePlugin QObject +PipListDialog QDialog Ui_PipListDialog +PipPackageDetailsDialog QDialog Ui_PipPackageDetailsDialog +PipPackagesInputDialog QDialog Ui_PipPackagesInputDialog +PipPage ConfigurationPageBase Ui_PipPage +PipRequirementsSelectionDialog QDialog Ui_PipRequirementsSelectionDialog +PipSearchDialog QDialog Ui_PipSearchDialog PixmapDiagram E5MainWindow PlainStrList list PlainTextDocumentationViewer QWidget
--- a/Documentation/Help/source.qhp Sat Dec 09 17:43:24 2017 +0100 +++ b/Documentation/Help/source.qhp Sat Dec 09 18:32:08 2017 +0100 @@ -513,6 +513,21 @@ <section title="eric6.Plugins.DocumentationPlugins.Ericdoc.EricdocExecDialog" ref="eric6.Plugins.DocumentationPlugins.Ericdoc.EricdocExecDialog.html" /> </section> </section> + <section title="eric6.Plugins.UiExtensionPlugins" ref="index-eric6.Plugins.UiExtensionPlugins.html"> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.html"> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html"> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html" /> + </section> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html" /> + <section title="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html" /> + </section> + </section> <section title="eric6.Plugins.VcsPlugins" ref="index-eric6.Plugins.VcsPlugins.html"> <section title="eric6.Plugins.VcsPlugins.vcsMercurial" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.html"> <section title="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html"> @@ -753,6 +768,7 @@ <section title="eric6.Plugins.PluginCodeStyleChecker" ref="eric6.Plugins.PluginCodeStyleChecker.html" /> <section title="eric6.Plugins.PluginEricapi" ref="eric6.Plugins.PluginEricapi.html" /> <section title="eric6.Plugins.PluginEricdoc" ref="eric6.Plugins.PluginEricdoc.html" /> + <section title="eric6.Plugins.PluginPipInterface" ref="eric6.Plugins.PluginPipInterface.html" /> <section title="eric6.Plugins.PluginSyntaxChecker" ref="eric6.Plugins.PluginSyntaxChecker.html" /> <section title="eric6.Plugins.PluginTabnanny" ref="eric6.Plugins.PluginTabnanny.html" /> <section title="eric6.Plugins.PluginVcsMercurial" ref="eric6.Plugins.PluginVcsMercurial.html" /> @@ -3081,6 +3097,7 @@ <keyword name="ConfigurationDialog.getExpandedEntries" id="ConfigurationDialog.getExpandedEntries" ref="eric6.Preferences.ConfigurationDialog.html#ConfigurationDialog.getExpandedEntries" /> <keyword name="ConfigurationDialog.setPreferences" id="ConfigurationDialog.setPreferences" ref="eric6.Preferences.ConfigurationDialog.html#ConfigurationDialog.setPreferences" /> <keyword name="ConfigurationDialog.showConfigurationPageByName" id="ConfigurationDialog.showConfigurationPageByName" ref="eric6.Preferences.ConfigurationDialog.html#ConfigurationDialog.showConfigurationPageByName" /> + <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html" /> <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html" /> <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsPySvn.ConfigurationPage.html" /> <keyword name="ConfigurationPage (Package)" id="ConfigurationPage (Package)" ref="index-eric6.Plugins.VcsPlugins.vcsSubversion.ConfigurationPage.html" /> @@ -10783,6 +10800,154 @@ <keyword name="PersonalInformationManager.showConfigurationDialog" id="PersonalInformationManager.showConfigurationDialog" ref="eric6.WebBrowser.PersonalInformationManager.PersonalInformationManager.html#PersonalInformationManager.showConfigurationDialog" /> <keyword name="PersonalInformationManager.viewKeyPressEvent" id="PersonalInformationManager.viewKeyPressEvent" ref="eric6.Helpviewer.PersonalInformationManager.PersonalInformationManager.html#PersonalInformationManager.viewKeyPressEvent" /> <keyword name="PersonalInformationManager.viewKeyPressEvent" id="PersonalInformationManager.viewKeyPressEvent" ref="eric6.WebBrowser.PersonalInformationManager.PersonalInformationManager.html#PersonalInformationManager.viewKeyPressEvent" /> + <keyword name="Pip" id="Pip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip" /> + <keyword name="Pip (Constructor)" id="Pip (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__init__" /> + <keyword name="Pip (Module)" id="Pip (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html" /> + <keyword name="Pip.__aboutToShowMenu" id="Pip.__aboutToShowMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__aboutToShowMenu" /> + <keyword name="Pip.__checkUpgradePyQt" id="Pip.__checkUpgradePyQt" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__checkUpgradePyQt" /> + <keyword name="Pip.__editConfiguration" id="Pip.__editConfiguration" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__editConfiguration" /> + <keyword name="Pip.__editUserConfiguration" id="Pip.__editUserConfiguration" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__editUserConfiguration" /> + <keyword name="Pip.__editVirtualenvConfiguration" id="Pip.__editVirtualenvConfiguration" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__editVirtualenvConfiguration" /> + <keyword name="Pip.__generateRequirements" id="Pip.__generateRequirements" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__generateRequirements" /> + <keyword name="Pip.__getPython" id="Pip.__getPython" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__getPython" /> + <keyword name="Pip.__getUserConfig" id="Pip.__getUserConfig" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__getUserConfig" /> + <keyword name="Pip.__getVirtualenvConfig" id="Pip.__getVirtualenvConfig" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__getVirtualenvConfig" /> + <keyword name="Pip.__handleTearOffMenu" id="Pip.__handleTearOffMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__handleTearOffMenu" /> + <keyword name="Pip.__installPackages" id="Pip.__installPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__installPackages" /> + <keyword name="Pip.__installPip" id="Pip.__installPip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__installPip" /> + <keyword name="Pip.__installRequirements" id="Pip.__installRequirements" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__installRequirements" /> + <keyword name="Pip.__listOutdatedPackages" id="Pip.__listOutdatedPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__listOutdatedPackages" /> + <keyword name="Pip.__listPackages" id="Pip.__listPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__listPackages" /> + <keyword name="Pip.__listUptodatePackages" id="Pip.__listUptodatePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__listUptodatePackages" /> + <keyword name="Pip.__pipConfigure" id="Pip.__pipConfigure" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__pipConfigure" /> + <keyword name="Pip.__repairPip" id="Pip.__repairPip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__repairPip" /> + <keyword name="Pip.__searchPyPI" id="Pip.__searchPyPI" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__searchPyPI" /> + <keyword name="Pip.__selectPipExecutable" id="Pip.__selectPipExecutable" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__selectPipExecutable" /> + <keyword name="Pip.__uninstallPackages" id="Pip.__uninstallPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__uninstallPackages" /> + <keyword name="Pip.__uninstallRequirements" id="Pip.__uninstallRequirements" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__uninstallRequirements" /> + <keyword name="Pip.__upgradePackages" id="Pip.__upgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.__upgradePackages" /> + <keyword name="Pip.getMenu" id="Pip.getMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.getMenu" /> + <keyword name="Pip.getMenuNames" id="Pip.getMenuNames" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.getMenuNames" /> + <keyword name="Pip.initActions" id="Pip.initActions" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.initActions" /> + <keyword name="Pip.initMenu" id="Pip.initMenu" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.initMenu" /> + <keyword name="Pip.installPackages" id="Pip.installPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.installPackages" /> + <keyword name="Pip.runProcess" id="Pip.runProcess" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.runProcess" /> + <keyword name="Pip.uninstallPackages" id="Pip.uninstallPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.uninstallPackages" /> + <keyword name="Pip.upgradePackages" id="Pip.upgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.upgradePackages" /> + <keyword name="Pip.upgradePip" id="Pip.upgradePip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html#Pip.upgradePip" /> + <keyword name="PipDialog" id="PipDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog" /> + <keyword name="PipDialog (Constructor)" id="PipDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__init__" /> + <keyword name="PipDialog (Module)" id="PipDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html" /> + <keyword name="PipDialog.__addOutput" id="PipDialog.__addOutput" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__addOutput" /> + <keyword name="PipDialog.__finish" id="PipDialog.__finish" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__finish" /> + <keyword name="PipDialog.__procFinished" id="PipDialog.__procFinished" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__procFinished" /> + <keyword name="PipDialog.__readStderr" id="PipDialog.__readStderr" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__readStderr" /> + <keyword name="PipDialog.__readStdout" id="PipDialog.__readStdout" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.__readStdout" /> + <keyword name="PipDialog.closeEvent" id="PipDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.closeEvent" /> + <keyword name="PipDialog.on_buttonBox_clicked" id="PipDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.on_buttonBox_clicked" /> + <keyword name="PipDialog.startProcess" id="PipDialog.startProcess" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.startProcess" /> + <keyword name="PipDialog.startProcesses" id="PipDialog.startProcesses" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html#PipDialog.startProcesses" /> + <keyword name="PipFreezeDialog" id="PipFreezeDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog" /> + <keyword name="PipFreezeDialog (Constructor)" id="PipFreezeDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__init__" /> + <keyword name="PipFreezeDialog (Module)" id="PipFreezeDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html" /> + <keyword name="PipFreezeDialog.__refresh" id="PipFreezeDialog.__refresh" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__refresh" /> + <keyword name="PipFreezeDialog.__updateButtons" id="PipFreezeDialog.__updateButtons" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__updateButtons" /> + <keyword name="PipFreezeDialog.__writeToFile" id="PipFreezeDialog.__writeToFile" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.__writeToFile" /> + <keyword name="PipFreezeDialog.closeEvent" id="PipFreezeDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.closeEvent" /> + <keyword name="PipFreezeDialog.on_buttonBox_clicked" id="PipFreezeDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_buttonBox_clicked" /> + <keyword name="PipFreezeDialog.on_copyButton_clicked" id="PipFreezeDialog.on_copyButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_copyButton_clicked" /> + <keyword name="PipFreezeDialog.on_fileButton_clicked" id="PipFreezeDialog.on_fileButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_fileButton_clicked" /> + <keyword name="PipFreezeDialog.on_insertButton_clicked" id="PipFreezeDialog.on_insertButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_insertButton_clicked" /> + <keyword name="PipFreezeDialog.on_localCheckBox_clicked" id="PipFreezeDialog.on_localCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_localCheckBox_clicked" /> + <keyword name="PipFreezeDialog.on_pipComboBox_activated" id="PipFreezeDialog.on_pipComboBox_activated" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_pipComboBox_activated" /> + <keyword name="PipFreezeDialog.on_replaceAllButton_clicked" id="PipFreezeDialog.on_replaceAllButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_replaceAllButton_clicked" /> + <keyword name="PipFreezeDialog.on_replaceSelectionButton_clicked" id="PipFreezeDialog.on_replaceSelectionButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_replaceSelectionButton_clicked" /> + <keyword name="PipFreezeDialog.on_requirementsEdit_textChanged" id="PipFreezeDialog.on_requirementsEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_requirementsEdit_textChanged" /> + <keyword name="PipFreezeDialog.on_requirementsFileEdit_textChanged" id="PipFreezeDialog.on_requirementsFileEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_requirementsFileEdit_textChanged" /> + <keyword name="PipFreezeDialog.on_saveButton_clicked" id="PipFreezeDialog.on_saveButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_saveButton_clicked" /> + <keyword name="PipFreezeDialog.on_saveToButton_clicked" id="PipFreezeDialog.on_saveToButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.on_saveToButton_clicked" /> + <keyword name="PipFreezeDialog.start" id="PipFreezeDialog.start" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html#PipFreezeDialog.start" /> + <keyword name="PipInterface (Package)" id="PipInterface (Package)" ref="index-eric6.Plugins.UiExtensionPlugins.PipInterface.html" /> + <keyword name="PipInterfacePlugin" id="PipInterfacePlugin" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin" /> + <keyword name="PipInterfacePlugin (Constructor)" id="PipInterfacePlugin (Constructor)" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.__init__" /> + <keyword name="PipInterfacePlugin.__initialize" id="PipInterfacePlugin.__initialize" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.__initialize" /> + <keyword name="PipInterfacePlugin.activate" id="PipInterfacePlugin.activate" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.activate" /> + <keyword name="PipInterfacePlugin.deactivate" id="PipInterfacePlugin.deactivate" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.deactivate" /> + <keyword name="PipInterfacePlugin.getDefaultPipExecutables" id="PipInterfacePlugin.getDefaultPipExecutables" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getDefaultPipExecutables" /> + <keyword name="PipInterfacePlugin.getMenu" id="PipInterfacePlugin.getMenu" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getMenu" /> + <keyword name="PipInterfacePlugin.getMenuNames" id="PipInterfacePlugin.getMenuNames" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getMenuNames" /> + <keyword name="PipInterfacePlugin.getPreferences" id="PipInterfacePlugin.getPreferences" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.getPreferences" /> + <keyword name="PipInterfacePlugin.setPreferences" id="PipInterfacePlugin.setPreferences" ref="eric6.Plugins.PluginPipInterface.html#PipInterfacePlugin.setPreferences" /> + <keyword name="PipListDialog" id="PipListDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog" /> + <keyword name="PipListDialog (Constructor)" id="PipListDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__init__" /> + <keyword name="PipListDialog (Module)" id="PipListDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html" /> + <keyword name="PipListDialog.__executeUpgradePackages" id="PipListDialog.__executeUpgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__executeUpgradePackages" /> + <keyword name="PipListDialog.__finish" id="PipListDialog.__finish" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__finish" /> + <keyword name="PipListDialog.__procFinished" id="PipListDialog.__procFinished" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__procFinished" /> + <keyword name="PipListDialog.__processOutput" id="PipListDialog.__processOutput" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__processOutput" /> + <keyword name="PipListDialog.__readStderr" id="PipListDialog.__readStderr" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__readStderr" /> + <keyword name="PipListDialog.__readStdout" id="PipListDialog.__readStdout" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__readStdout" /> + <keyword name="PipListDialog.__refresh" id="PipListDialog.__refresh" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__refresh" /> + <keyword name="PipListDialog.__stopProcess" id="PipListDialog.__stopProcess" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__stopProcess" /> + <keyword name="PipListDialog.__uninstallPackages" id="PipListDialog.__uninstallPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__uninstallPackages" /> + <keyword name="PipListDialog.__upgradeAllPackages" id="PipListDialog.__upgradeAllPackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__upgradeAllPackages" /> + <keyword name="PipListDialog.__upgradePackages" id="PipListDialog.__upgradePackages" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__upgradePackages" /> + <keyword name="PipListDialog.__upgradePip" id="PipListDialog.__upgradePip" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.__upgradePip" /> + <keyword name="PipListDialog.closeEvent" id="PipListDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.closeEvent" /> + <keyword name="PipListDialog.on_buttonBox_clicked" id="PipListDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_buttonBox_clicked" /> + <keyword name="PipListDialog.on_installedFilesCheckBox_clicked" id="PipListDialog.on_installedFilesCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_installedFilesCheckBox_clicked" /> + <keyword name="PipListDialog.on_localCheckBox_clicked" id="PipListDialog.on_localCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_localCheckBox_clicked" /> + <keyword name="PipListDialog.on_notRequiredCheckBox_clicked" id="PipListDialog.on_notRequiredCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_notRequiredCheckBox_clicked" /> + <keyword name="PipListDialog.on_packageList_itemSelectionChanged" id="PipListDialog.on_packageList_itemSelectionChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_packageList_itemSelectionChanged" /> + <keyword name="PipListDialog.on_pipComboBox_activated" id="PipListDialog.on_pipComboBox_activated" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_pipComboBox_activated" /> + <keyword name="PipListDialog.on_verboseCheckBox_clicked" id="PipListDialog.on_verboseCheckBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.on_verboseCheckBox_clicked" /> + <keyword name="PipListDialog.start" id="PipListDialog.start" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html#PipListDialog.start" /> + <keyword name="PipPackageDetailsDialog" id="PipPackageDetailsDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog" /> + <keyword name="PipPackageDetailsDialog (Constructor)" id="PipPackageDetailsDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__init__" /> + <keyword name="PipPackageDetailsDialog (Module)" id="PipPackageDetailsDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html" /> + <keyword name="PipPackageDetailsDialog.__formatSize" id="PipPackageDetailsDialog.__formatSize" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__formatSize" /> + <keyword name="PipPackageDetailsDialog.__formatUploadDate" id="PipPackageDetailsDialog.__formatUploadDate" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__formatUploadDate" /> + <keyword name="PipPackageDetailsDialog.__populateDetails" id="PipPackageDetailsDialog.__populateDetails" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__populateDetails" /> + <keyword name="PipPackageDetailsDialog.__populateDownloadUrls" id="PipPackageDetailsDialog.__populateDownloadUrls" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__populateDownloadUrls" /> + <keyword name="PipPackageDetailsDialog.__populateRequiresProvides" id="PipPackageDetailsDialog.__populateRequiresProvides" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__populateRequiresProvides" /> + <keyword name="PipPackageDetailsDialog.__sanitize" id="PipPackageDetailsDialog.__sanitize" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html#PipPackageDetailsDialog.__sanitize" /> + <keyword name="PipPackagesInputDialog" id="PipPackagesInputDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog" /> + <keyword name="PipPackagesInputDialog (Constructor)" id="PipPackagesInputDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog.__init__" /> + <keyword name="PipPackagesInputDialog (Module)" id="PipPackagesInputDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html" /> + <keyword name="PipPackagesInputDialog.getData" id="PipPackagesInputDialog.getData" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog.getData" /> + <keyword name="PipPackagesInputDialog.on_packagesEdit_textChanged" id="PipPackagesInputDialog.on_packagesEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html#PipPackagesInputDialog.on_packagesEdit_textChanged" /> + <keyword name="PipPage" id="PipPage" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage" /> + <keyword name="PipPage (Constructor)" id="PipPage (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.__init__" /> + <keyword name="PipPage (Module)" id="PipPage (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html" /> + <keyword name="PipPage.on_addButton_clicked" id="PipPage.on_addButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.on_addButton_clicked" /> + <keyword name="PipPage.on_defaultListButton_clicked" id="PipPage.on_defaultListButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.on_defaultListButton_clicked" /> + <keyword name="PipPage.save" id="PipPage.save" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html#PipPage.save" /> + <keyword name="PipRequirementsSelectionDialog" id="PipRequirementsSelectionDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog" /> + <keyword name="PipRequirementsSelectionDialog (Constructor)" id="PipRequirementsSelectionDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.__init__" /> + <keyword name="PipRequirementsSelectionDialog (Module)" id="PipRequirementsSelectionDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html" /> + <keyword name="PipRequirementsSelectionDialog.getData" id="PipRequirementsSelectionDialog.getData" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.getData" /> + <keyword name="PipRequirementsSelectionDialog.on_fileButton_clicked" id="PipRequirementsSelectionDialog.on_fileButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.on_fileButton_clicked" /> + <keyword name="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" id="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html#PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" /> + <keyword name="PipSearchDialog" id="PipSearchDialog" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog" /> + <keyword name="PipSearchDialog (Constructor)" id="PipSearchDialog (Constructor)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__init__" /> + <keyword name="PipSearchDialog (Module)" id="PipSearchDialog (Module)" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html" /> + <keyword name="PipSearchDialog.__detailsError" id="PipSearchDialog.__detailsError" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__detailsError" /> + <keyword name="PipSearchDialog.__displayPackageDetails" id="PipSearchDialog.__displayPackageDetails" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__displayPackageDetails" /> + <keyword name="PipSearchDialog.__finish" id="PipSearchDialog.__finish" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__finish" /> + <keyword name="PipSearchDialog.__getPackageDownloadsData" id="PipSearchDialog.__getPackageDownloadsData" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__getPackageDownloadsData" /> + <keyword name="PipSearchDialog.__install" id="PipSearchDialog.__install" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__install" /> + <keyword name="PipSearchDialog.__processSearchResult" id="PipSearchDialog.__processSearchResult" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__processSearchResult" /> + <keyword name="PipSearchDialog.__score" id="PipSearchDialog.__score" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__score" /> + <keyword name="PipSearchDialog.__search" id="PipSearchDialog.__search" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__search" /> + <keyword name="PipSearchDialog.__searchError" id="PipSearchDialog.__searchError" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__searchError" /> + <keyword name="PipSearchDialog.__showDetails" id="PipSearchDialog.__showDetails" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__showDetails" /> + <keyword name="PipSearchDialog.__transformHits" id="PipSearchDialog.__transformHits" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.__transformHits" /> + <keyword name="PipSearchDialog.closeEvent" id="PipSearchDialog.closeEvent" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.closeEvent" /> + <keyword name="PipSearchDialog.on_buttonBox_clicked" id="PipSearchDialog.on_buttonBox_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_buttonBox_clicked" /> + <keyword name="PipSearchDialog.on_resultList_itemActivated" id="PipSearchDialog.on_resultList_itemActivated" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_resultList_itemActivated" /> + <keyword name="PipSearchDialog.on_resultList_itemSelectionChanged" id="PipSearchDialog.on_resultList_itemSelectionChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_resultList_itemSelectionChanged" /> + <keyword name="PipSearchDialog.on_searchButton_clicked" id="PipSearchDialog.on_searchButton_clicked" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_searchButton_clicked" /> + <keyword name="PipSearchDialog.on_searchEdit_textChanged" id="PipSearchDialog.on_searchEdit_textChanged" ref="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html#PipSearchDialog.on_searchEdit_textChanged" /> <keyword name="PixmapCache" id="PixmapCache" ref="eric6.UI.PixmapCache.html#PixmapCache" /> <keyword name="PixmapCache (Constructor)" id="PixmapCache (Constructor)" ref="eric6.UI.PixmapCache.html#PixmapCache.__init__" /> <keyword name="PixmapCache (Module)" id="PixmapCache (Module)" ref="eric6.UI.PixmapCache.html" /> @@ -10965,6 +11130,7 @@ <keyword name="PluginModulesError (Constructor)" id="PluginModulesError (Constructor)" ref="eric6.PluginManager.PluginExceptions.html#PluginModulesError.__init__" /> <keyword name="PluginPathError" id="PluginPathError" ref="eric6.PluginManager.PluginExceptions.html#PluginPathError" /> <keyword name="PluginPathError (Constructor)" id="PluginPathError (Constructor)" ref="eric6.PluginManager.PluginExceptions.html#PluginPathError.__init__" /> + <keyword name="PluginPipInterface (Module)" id="PluginPipInterface (Module)" ref="eric6.Plugins.PluginPipInterface.html" /> <keyword name="PluginPy2IncompatibleError" id="PluginPy2IncompatibleError" ref="eric6.PluginManager.PluginExceptions.html#PluginPy2IncompatibleError" /> <keyword name="PluginPy2IncompatibleError (Constructor)" id="PluginPy2IncompatibleError (Constructor)" ref="eric6.PluginManager.PluginExceptions.html#PluginPy2IncompatibleError.__init__" /> <keyword name="PluginRepositoryDialog" id="PluginRepositoryDialog" ref="eric6.PluginManager.PluginRepositoryDialog.html#PluginRepositoryDialog" /> @@ -15001,6 +15167,7 @@ <keyword name="UMLSceneSizeDialog (Constructor)" id="UMLSceneSizeDialog (Constructor)" ref="eric6.Graphics.UMLSceneSizeDialog.html#UMLSceneSizeDialog.__init__" /> <keyword name="UMLSceneSizeDialog (Module)" id="UMLSceneSizeDialog (Module)" ref="eric6.Graphics.UMLSceneSizeDialog.html" /> <keyword name="UMLSceneSizeDialog.getData" id="UMLSceneSizeDialog.getData" ref="eric6.Graphics.UMLSceneSizeDialog.html#UMLSceneSizeDialog.getData" /> + <keyword name="UiExtensionPlugins (Package)" id="UiExtensionPlugins (Package)" ref="index-eric6.Plugins.UiExtensionPlugins.html" /> <keyword name="Uid" id="Uid" ref="eric6.Utilities.binplistlib.html#Uid" /> <keyword name="Uid.__repr__" id="Uid.__repr__" ref="eric6.Utilities.binplistlib.html#Uid.__repr__" /> <keyword name="UniqueNamespace" id="UniqueNamespace" ref="eric6.E5Network.E5RFC6266.html#UniqueNamespace" /> @@ -16810,6 +16977,7 @@ <keyword name="_add_check" id="_add_check" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#_add_check" /> <keyword name="_buildChildrenLists" id="_buildChildrenLists" ref="eric6.Graphics.GraphicsUtilities.html#_buildChildrenLists" /> <keyword name="_encode_base64" id="_encode_base64" ref="eric6.UI.EmailDialog.html#_encode_base64" /> + <keyword name="_findDefaultExecutables" id="_findDefaultExecutables" ref="eric6.Plugins.PluginPipInterface.html#_findDefaultExecutables" /> <keyword name="_get_parameters" id="_get_parameters" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#_get_parameters" /> <keyword name="_getfullargs" id="_getfullargs" ref="eric6.DebugClients.Python.DebugUtilities.html#_getfullargs" /> <keyword name="_indent" id="_indent" ref="eric6.Utilities.ClassBrowsers.pyclbr.html#_indent" /> @@ -16967,6 +17135,7 @@ <keyword name="createMainWidget" id="createMainWidget" ref="eric6.eric6_uipreviewer.html#createMainWidget" /> <keyword name="createMainWidget" id="createMainWidget" ref="eric6.eric6_unittest.html#createMainWidget" /> <keyword name="createMainWidget" id="createMainWidget" ref="eric6.eric6_webbrowser.html#createMainWidget" /> + <keyword name="createPipPage" id="createPipPage" ref="eric6.Plugins.PluginPipInterface.html#createPipPage" /> <keyword name="createPyWrapper" id="createPyWrapper" ref="eric6.install.html#createPyWrapper" /> <keyword name="critical" id="critical" ref="eric6.E5Gui.E5MessageBox.html#critical" /> <keyword name="crypto (Package)" id="crypto (Package)" ref="index-eric6.Utilities.crypto.html" /> @@ -17033,6 +17202,7 @@ <keyword name="exeDisplayData" id="exeDisplayData" ref="eric6.Plugins.PluginVcsPySvn.html#exeDisplayData" /> <keyword name="exeDisplayData" id="exeDisplayData" ref="eric6.Plugins.PluginVcsSubversion.html#exeDisplayData" /> <keyword name="exeDisplayDataList" id="exeDisplayDataList" ref="eric6.Plugins.PluginEricdoc.html#exeDisplayDataList" /> + <keyword name="exeDisplayDataList" id="exeDisplayDataList" ref="eric6.Plugins.PluginPipInterface.html#exeDisplayDataList" /> <keyword name="exit" id="exit" ref="eric6.install-debugclients.html#exit" /> <keyword name="exit" id="exit" ref="eric6.install.html#exit" /> <keyword name="exit" id="exit" ref="eric6.uninstall-debugclients.html#exit" /> @@ -17077,6 +17247,7 @@ <keyword name="getCombinedIcon" id="getCombinedIcon" ref="eric6.UI.PixmapCache.html#getCombinedIcon" /> <keyword name="getCompleter" id="getCompleter" ref="eric6.QScintilla.TypingCompleters.__init__.html#getCompleter" /> <keyword name="getConfig" id="getConfig" ref="eric6.eric6config.html#getConfig" /> + <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginPipInterface.html#getConfigData" /> <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginVcsMercurial.html#getConfigData" /> <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginVcsPySvn.html#getConfigData" /> <keyword name="getConfigData" id="getConfigData" ref="eric6.Plugins.PluginVcsSubversion.html#getConfigData" /> @@ -17105,6 +17276,7 @@ <keyword name="getEditorOtherFonts" id="getEditorOtherFonts" ref="eric6.Preferences.__init__.html#getEditorOtherFonts" /> <keyword name="getEditorTyping" id="getEditorTyping" ref="eric6.Preferences.__init__.html#getEditorTyping" /> <keyword name="getEnvironmentEntry" id="getEnvironmentEntry" ref="eric6.Utilities.__init__.html#getEnvironmentEntry" /> + <keyword name="getExePath" id="getExePath" ref="eric6.Plugins.PluginPipInterface.html#getExePath" /> <keyword name="getExecutablePath" id="getExecutablePath" ref="eric6.Utilities.__init__.html#getExecutablePath" /> <keyword name="getExecutablePaths" id="getExecutablePaths" ref="eric6.Utilities.__init__.html#getExecutablePaths" /> <keyword name="getExistingDirectory" id="getExistingDirectory" ref="eric6.E5Gui.E5FileDialog.html#getExistingDirectory" /> @@ -17368,6 +17540,7 @@ <keyword name="prepareJsonCommand" id="prepareJsonCommand" ref="eric6.DebugClients.Python.DebugUtilities.html#prepareJsonCommand" /> <keyword name="prepareProcess" id="prepareProcess" ref="eric6.Plugins.VcsPlugins.vcsMercurial.HgUtilities.html#prepareProcess" /> <keyword name="prepareQtMacBundle" id="prepareQtMacBundle" ref="eric6.Utilities.__init__.html#prepareQtMacBundle" /> + <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginPipInterface.html#prepareUninstall" /> <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginVcsMercurial.html#prepareUninstall" /> <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginVcsPySvn.html#prepareUninstall" /> <keyword name="prepareUninstall" id="prepareUninstall" ref="eric6.Plugins.PluginVcsSubversion.html#prepareUninstall" /> @@ -17989,6 +18162,7 @@ <file>eric6.Plugins.PluginCodeStyleChecker.html</file> <file>eric6.Plugins.PluginEricapi.html</file> <file>eric6.Plugins.PluginEricdoc.html</file> + <file>eric6.Plugins.PluginPipInterface.html</file> <file>eric6.Plugins.PluginSyntaxChecker.html</file> <file>eric6.Plugins.PluginTabnanny.html</file> <file>eric6.Plugins.PluginVcsMercurial.html</file> @@ -18005,6 +18179,15 @@ <file>eric6.Plugins.PluginWizardQMessageBox.html</file> <file>eric6.Plugins.PluginWizardQRegExp.html</file> <file>eric6.Plugins.PluginWizardQRegularExpression.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html</file> + <file>eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html</file> <file>eric6.Plugins.VcsPlugins.vcsMercurial.Config.html</file> <file>eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html</file> <file>eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.HgFetchDialog.html</file> @@ -18725,6 +18908,9 @@ <file>index-eric6.Plugins.DocumentationPlugins.Ericapi.html</file> <file>index-eric6.Plugins.DocumentationPlugins.Ericdoc.html</file> <file>index-eric6.Plugins.DocumentationPlugins.html</file> + <file>index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html</file> + <file>index-eric6.Plugins.UiExtensionPlugins.PipInterface.html</file> + <file>index-eric6.Plugins.UiExtensionPlugins.html</file> <file>index-eric6.Plugins.VcsPlugins.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.html</file> <file>index-eric6.Plugins.VcsPlugins.vcsMercurial.FetchExtension.html</file>
--- a/Documentation/Source/eric6.E5XML.Config.html Sat Dec 09 17:43:24 2017 +0100 +++ b/Documentation/Source/eric6.E5XML.Config.html Sat Dec 09 18:32:08 2017 +0100 @@ -25,7 +25,7 @@ </p> <h3>Global Attributes</h3> <table> -<tr><td>debuggerPropertiesFileFormatVersion</td></tr><tr><td>dictionariesListFileFormatVersion</td></tr><tr><td>highlightingStylesFileFormatVersion</td></tr><tr><td>multiProjectFileFormatVersion</td></tr><tr><td>pluginRepositoryFileFormatVersion</td></tr><tr><td>projectFileFormatVersion</td></tr><tr><td>sessionFileFormatVersion</td></tr><tr><td>shortcutsFileFormatVersion</td></tr><tr><td>tasksFileFormatVersion</td></tr><tr><td>templatesFileFormatVersion</td></tr><tr><td>userProjectFileFormatVersion</td></tr> +<tr><td>debuggerPropertiesFileFormatVersion</td></tr><tr><td>dictionariesListFileFormatVersion</td></tr><tr><td>highlightingStylesFileFormatVersion</td></tr><tr><td>multiProjectFileFormatVersion</td></tr><tr><td>pluginRepositoryFileFormatVersion</td></tr><tr><td>projectFileFormatVersion</td></tr><tr><td>projectFileFormatVersionAlt</td></tr><tr><td>sessionFileFormatVersion</td></tr><tr><td>shortcutsFileFormatVersion</td></tr><tr><td>tasksFileFormatVersion</td></tr><tr><td>templatesFileFormatVersion</td></tr><tr><td>userProjectFileFormatVersion</td></tr> </table> <h3>Classes</h3> <table>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.PluginPipInterface.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,291 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.PluginPipInterface</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.PluginPipInterface</h1> +<p> +Module implementing the pip interface plug-in. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>author</td></tr><tr><td>autoactivate</td></tr><tr><td>className</td></tr><tr><td>deactivateable</td></tr><tr><td>error</td></tr><tr><td>longDescription</td></tr><tr><td>name</td></tr><tr><td>needsRestart</td></tr><tr><td>packageName</td></tr><tr><td>pipPluginObject</td></tr><tr><td>pyqtApi</td></tr><tr><td>python2Compatible</td></tr><tr><td>shortDescription</td></tr><tr><td>version</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipInterfacePlugin">PipInterfacePlugin</a></td> +<td>Class implementing the pip interface plug-in.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr> +<td><a href="#_findDefaultExecutables">_findDefaultExecutables</a></td> +<td>Restricted function to determine the name and path of the executables.</td> +</tr><tr> +<td><a href="#createPipPage">createPipPage</a></td> +<td>Module function to create the pip configuration page.</td> +</tr><tr> +<td><a href="#exeDisplayDataList">exeDisplayDataList</a></td> +<td>Module function to support the display of some executable info.</td> +</tr><tr> +<td><a href="#getConfigData">getConfigData</a></td> +<td>Module function returning data as required by the configuration dialog.</td> +</tr><tr> +<td><a href="#getExePath">getExePath</a></td> +<td></td> +</tr><tr> +<td><a href="#prepareUninstall">prepareUninstall</a></td> +<td>Module function to prepare for an un-installation.</td> +</tr> +</table> +<hr /><hr /> +<a NAME="PipInterfacePlugin" ID="PipInterfacePlugin"></a> +<h2>PipInterfacePlugin</h2> +<p> + Class implementing the pip interface plug-in. +</p><h3>Signals</h3> +<dl> +<dt>currentPipChanged(exe)</dt> +<dd> +emitted to signal a change of the current + pip executable +</dd> +</dl> +<h3>Derived from</h3> +QObject +<h3>Class Attributes</h3> +<table> +<tr><td>PreferencesKey</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipInterfacePlugin.__init__">PipInterfacePlugin</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.__initialize">__initialize</a></td> +<td>Private slot to (re)initialize the plugin.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.activate">activate</a></td> +<td>Public method to activate this plugin.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.deactivate">deactivate</a></td> +<td>Public method to deactivate this plugin.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.getDefaultPipExecutables">getDefaultPipExecutables</a></td> +<td>Public method to get the default list of pip executables.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.getMenu">getMenu</a></td> +<td>Public method to get a reference to the requested menu.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.getMenuNames">getMenuNames</a></td> +<td>Public method to get the names of all menus.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.getPreferences">getPreferences</a></td> +<td>Public method to retrieve the various refactoring settings.</td> +</tr><tr> +<td><a href="#PipInterfacePlugin.setPreferences">setPreferences</a></td> +<td>Public method to store the various refactoring settings.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipInterfacePlugin.__init__" ID="PipInterfacePlugin.__init__"></a> +<h4>PipInterfacePlugin (Constructor)</h4> +<b>PipInterfacePlugin</b>(<i>ui</i>) +<p> + Constructor +</p><dl> +<dt><i>ui</i></dt> +<dd> +reference to the user interface object (UI.UserInterface) +</dd> +</dl><a NAME="PipInterfacePlugin.__initialize" ID="PipInterfacePlugin.__initialize"></a> +<h4>PipInterfacePlugin.__initialize</h4> +<b>__initialize</b>(<i></i>) +<p> + Private slot to (re)initialize the plugin. +</p><a NAME="PipInterfacePlugin.activate" ID="PipInterfacePlugin.activate"></a> +<h4>PipInterfacePlugin.activate</h4> +<b>activate</b>(<i></i>) +<p> + Public method to activate this plugin. +</p><dl> +<dt>Returns:</dt> +<dd> +tuple of None and activation status (boolean) +</dd> +</dl><a NAME="PipInterfacePlugin.deactivate" ID="PipInterfacePlugin.deactivate"></a> +<h4>PipInterfacePlugin.deactivate</h4> +<b>deactivate</b>(<i></i>) +<p> + Public method to deactivate this plugin. +</p><a NAME="PipInterfacePlugin.getDefaultPipExecutables" ID="PipInterfacePlugin.getDefaultPipExecutables"></a> +<h4>PipInterfacePlugin.getDefaultPipExecutables</h4> +<b>getDefaultPipExecutables</b>(<i></i>) +<p> + Public method to get the default list of pip executables. +</p><dl> +<dt>Returns:</dt> +<dd> +list of pip executables (list of string) +</dd> +</dl><a NAME="PipInterfacePlugin.getMenu" ID="PipInterfacePlugin.getMenu"></a> +<h4>PipInterfacePlugin.getMenu</h4> +<b>getMenu</b>(<i>name</i>) +<p> + Public method to get a reference to the requested menu. +</p><dl> +<dt><i>name</i></dt> +<dd> +name of the menu (string) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +reference to the menu (QMenu) or None, if no + menu with the given name exists +</dd> +</dl><a NAME="PipInterfacePlugin.getMenuNames" ID="PipInterfacePlugin.getMenuNames"></a> +<h4>PipInterfacePlugin.getMenuNames</h4> +<b>getMenuNames</b>(<i></i>) +<p> + Public method to get the names of all menus. +</p><dl> +<dt>Returns:</dt> +<dd> +menu names (list of string) +</dd> +</dl><a NAME="PipInterfacePlugin.getPreferences" ID="PipInterfacePlugin.getPreferences"></a> +<h4>PipInterfacePlugin.getPreferences</h4> +<b>getPreferences</b>(<i>key</i>) +<p> + Public method to retrieve the various refactoring settings. +</p><dl> +<dt><i>key</i></dt> +<dd> +the key of the value to get +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +the requested refactoring setting +</dd> +</dl><a NAME="PipInterfacePlugin.setPreferences" ID="PipInterfacePlugin.setPreferences"></a> +<h4>PipInterfacePlugin.setPreferences</h4> +<b>setPreferences</b>(<i>key, value</i>) +<p> + Public method to store the various refactoring settings. +</p><dl> +<dt><i>key</i></dt> +<dd> +the key of the setting to be set (string) +</dd><dt><i>value</i></dt> +<dd> +the value to be set +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="_findDefaultExecutables" ID="_findDefaultExecutables"></a> +<h2>_findDefaultExecutables</h2> +<b>_findDefaultExecutables</b>(<i>majorVersion</i>) +<p> + Restricted function to determine the name and path of the executables. +</p><dl> +<dt><i>majorVersion</i></dt> +<dd> +major python version of the executables (int) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +path names of the executables (list of string) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="createPipPage" ID="createPipPage"></a> +<h2>createPipPage</h2> +<b>createPipPage</b>(<i>configDlg</i>) +<p> + Module function to create the pip configuration page. +</p><dl> +<dt><i>configDlg</i></dt> +<dd> +reference to the configuration dialog +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +reference to the configuration page +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="exeDisplayDataList" ID="exeDisplayDataList"></a> +<h2>exeDisplayDataList</h2> +<b>exeDisplayDataList</b>(<i></i>) +<p> + Module function to support the display of some executable info. +</p><dl> +<dt>Returns:</dt> +<dd> +list of dictionaries containing the data to query the presence of + the executable +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="getConfigData" ID="getConfigData"></a> +<h2>getConfigData</h2> +<b>getConfigData</b>(<i></i>) +<p> + Module function returning data as required by the configuration dialog. +</p><dl> +<dt>Returns:</dt> +<dd> +dictionary containing the relevant data +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="getExePath" ID="getExePath"></a> +<h2>getExePath</h2> +<b>getExePath</b>(<i>branch, access, versionStr</i>) + +<div align="right"><a href="#top">Up</a></div> +<hr /><hr /> +<a NAME="prepareUninstall" ID="prepareUninstall"></a> +<h2>prepareUninstall</h2> +<b>prepareUninstall</b>(<i></i>) +<p> + Module function to prepare for an un-installation. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,105 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage</h1> +<p> +Package implementing the configuration page. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipPage">PipPage</a></td> +<td>Class implementing the configuration page.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipPage" ID="PipPage"></a> +<h2>PipPage</h2> +<p> + Class implementing the configuration page. +</p> +<h3>Derived from</h3> +ConfigurationPageBase, Ui_PipPage +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipPage.__init__">PipPage</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipPage.on_addButton_clicked">on_addButton_clicked</a></td> +<td>Private slot used to add an executable to the list.</td> +</tr><tr> +<td><a href="#PipPage.on_defaultListButton_clicked">on_defaultListButton_clicked</a></td> +<td>Private slot to load the default list of pip executables.</td> +</tr><tr> +<td><a href="#PipPage.save">save</a></td> +<td>Public slot to save the pip configuration.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipPage.__init__" ID="PipPage.__init__"></a> +<h4>PipPage (Constructor)</h4> +<b>PipPage</b>(<i>plugin</i>) +<p> + Constructor +</p><dl> +<dt><i>plugin</i></dt> +<dd> +reference to the plugin object +</dd> +</dl><a NAME="PipPage.on_addButton_clicked" ID="PipPage.on_addButton_clicked"></a> +<h4>PipPage.on_addButton_clicked</h4> +<b>on_addButton_clicked</b>(<i></i>) +<p> + Private slot used to add an executable to the list. +</p><a NAME="PipPage.on_defaultListButton_clicked" ID="PipPage.on_defaultListButton_clicked"></a> +<h4>PipPage.on_defaultListButton_clicked</h4> +<b>on_defaultListButton_clicked</b>(<i></i>) +<p> + Private slot to load the default list of pip executables. +</p><a NAME="PipPage.save" ID="PipPage.save"></a> +<h4>PipPage.save</h4> +<b>save</b>(<i></i>) +<p> + Public slot to save the pip configuration. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,477 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.Pip</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.Pip</h1> +<p> +Package implementing the pip GUI logic. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#Pip">Pip</a></td> +<td>Class implementing the pip GUI logic.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="Pip" ID="Pip"></a> +<h2>Pip</h2> +<p> + Class implementing the pip GUI logic. +</p> +<h3>Derived from</h3> +QObject +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#Pip.__init__">Pip</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#Pip.__aboutToShowMenu">__aboutToShowMenu</a></td> +<td>Private slot to set the action enabled status.</td> +</tr><tr> +<td><a href="#Pip.__checkUpgradePyQt">__checkUpgradePyQt</a></td> +<td>Private method to check, if an upgrade of PyQt packages is attempted.</td> +</tr><tr> +<td><a href="#Pip.__editConfiguration">__editConfiguration</a></td> +<td>Private method to edit a configuration.</td> +</tr><tr> +<td><a href="#Pip.__editUserConfiguration">__editUserConfiguration</a></td> +<td>Private slot to edit the user configuration.</td> +</tr><tr> +<td><a href="#Pip.__editVirtualenvConfiguration">__editVirtualenvConfiguration</a></td> +<td>Private slot to edit the current virtualenv configuration.</td> +</tr><tr> +<td><a href="#Pip.__generateRequirements">__generateRequirements</a></td> +<td>Private slot to generate the contents for a requirements file.</td> +</tr><tr> +<td><a href="#Pip.__getPython">__getPython</a></td> +<td>Private method to derive the path to the python executable given the path to the pip executable.</td> +</tr><tr> +<td><a href="#Pip.__getUserConfig">__getUserConfig</a></td> +<td>Private method to get the name of the user configuration file.</td> +</tr><tr> +<td><a href="#Pip.__getVirtualenvConfig">__getVirtualenvConfig</a></td> +<td>Private method to get the name of the virtualenv configuration file.</td> +</tr><tr> +<td><a href="#Pip.__handleTearOffMenu">__handleTearOffMenu</a></td> +<td>Private slot to handle a change of the pip executable.</td> +</tr><tr> +<td><a href="#Pip.__installPackages">__installPackages</a></td> +<td>Private slot to install packages to be given by the user.</td> +</tr><tr> +<td><a href="#Pip.__installPip">__installPip</a></td> +<td>Private slot to install pip.</td> +</tr><tr> +<td><a href="#Pip.__installRequirements">__installRequirements</a></td> +<td>Private slot to install packages as given in a requirements file.</td> +</tr><tr> +<td><a href="#Pip.__listOutdatedPackages">__listOutdatedPackages</a></td> +<td>Private slot to list all installed, up-to-date packages.</td> +</tr><tr> +<td><a href="#Pip.__listPackages">__listPackages</a></td> +<td>Private slot to list all installed packages.</td> +</tr><tr> +<td><a href="#Pip.__listUptodatePackages">__listUptodatePackages</a></td> +<td>Private slot to list all installed, up-to-date packages.</td> +</tr><tr> +<td><a href="#Pip.__pipConfigure">__pipConfigure</a></td> +<td>Private slot to open the configuration page.</td> +</tr><tr> +<td><a href="#Pip.__repairPip">__repairPip</a></td> +<td></td> +</tr><tr> +<td><a href="#Pip.__searchPyPI">__searchPyPI</a></td> +<td>Private slot to search the Python Package Index.</td> +</tr><tr> +<td><a href="#Pip.__selectPipExecutable">__selectPipExecutable</a></td> +<td>Private method to select the pip executable to be used.</td> +</tr><tr> +<td><a href="#Pip.__uninstallPackages">__uninstallPackages</a></td> +<td>Private slot to uninstall packages to be given by the user.</td> +</tr><tr> +<td><a href="#Pip.__uninstallRequirements">__uninstallRequirements</a></td> +<td>Private slot to uninstall packages as given in a requirements file.</td> +</tr><tr> +<td><a href="#Pip.__upgradePackages">__upgradePackages</a></td> +<td>Private slot to upgrade packages to be given by the user.</td> +</tr><tr> +<td><a href="#Pip.getMenu">getMenu</a></td> +<td>Public method to get a reference to the requested menu.</td> +</tr><tr> +<td><a href="#Pip.getMenuNames">getMenuNames</a></td> +<td>Public method to get the names of all menus.</td> +</tr><tr> +<td><a href="#Pip.initActions">initActions</a></td> +<td>Public method to define the Django actions.</td> +</tr><tr> +<td><a href="#Pip.initMenu">initMenu</a></td> +<td>Public slot to initialize the Django menu.</td> +</tr><tr> +<td><a href="#Pip.installPackages">installPackages</a></td> +<td>Public method to install the given list of packages.</td> +</tr><tr> +<td><a href="#Pip.runProcess">runProcess</a></td> +<td>Public method to execute the current pip with the given arguments.</td> +</tr><tr> +<td><a href="#Pip.uninstallPackages">uninstallPackages</a></td> +<td>Public method to uninstall the given list of packages.</td> +</tr><tr> +<td><a href="#Pip.upgradePackages">upgradePackages</a></td> +<td>Public method to upgrade the given list of packages.</td> +</tr><tr> +<td><a href="#Pip.upgradePip">upgradePip</a></td> +<td>Public method to upgrade pip itself.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="Pip.__init__" ID="Pip.__init__"></a> +<h4>Pip (Constructor)</h4> +<b>Pip</b>(<i>plugin, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>plugin</i></dt> +<dd> +reference to the plugin object +</dd><dt><i>parent</i></dt> +<dd> +parent (QObject) +</dd> +</dl><a NAME="Pip.__aboutToShowMenu" ID="Pip.__aboutToShowMenu"></a> +<h4>Pip.__aboutToShowMenu</h4> +<b>__aboutToShowMenu</b>(<i></i>) +<p> + Private slot to set the action enabled status. +</p><a NAME="Pip.__checkUpgradePyQt" ID="Pip.__checkUpgradePyQt"></a> +<h4>Pip.__checkUpgradePyQt</h4> +<b>__checkUpgradePyQt</b>(<i>packages</i>) +<p> + Private method to check, if an upgrade of PyQt packages is attempted. +</p><dl> +<dt><i>packages</i> (list of str)</dt> +<dd> +list of packages to upgrade +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating to abort the upgrade attempt +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl><a NAME="Pip.__editConfiguration" ID="Pip.__editConfiguration"></a> +<h4>Pip.__editConfiguration</h4> +<b>__editConfiguration</b>(<i>virtualenv=False</i>) +<p> + Private method to edit a configuration. +</p><dl> +<dt><i>virtualenv</i></dt> +<dd> +flag indicating to edit the current virtualenv + configuration file (boolean) +</dd> +</dl><a NAME="Pip.__editUserConfiguration" ID="Pip.__editUserConfiguration"></a> +<h4>Pip.__editUserConfiguration</h4> +<b>__editUserConfiguration</b>(<i></i>) +<p> + Private slot to edit the user configuration. +</p><a NAME="Pip.__editVirtualenvConfiguration" ID="Pip.__editVirtualenvConfiguration"></a> +<h4>Pip.__editVirtualenvConfiguration</h4> +<b>__editVirtualenvConfiguration</b>(<i></i>) +<p> + Private slot to edit the current virtualenv configuration. +</p><a NAME="Pip.__generateRequirements" ID="Pip.__generateRequirements"></a> +<h4>Pip.__generateRequirements</h4> +<b>__generateRequirements</b>(<i></i>) +<p> + Private slot to generate the contents for a requirements file. +</p><a NAME="Pip.__getPython" ID="Pip.__getPython"></a> +<h4>Pip.__getPython</h4> +<b>__getPython</b>(<i>cmd</i>) +<p> + Private method to derive the path to the python executable given the + path to the pip executable. +</p><dl> +<dt><i>cmd</i> (str)</dt> +<dd> +path of the pip executable +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +path of the python executable +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +str +</dd> +</dl><a NAME="Pip.__getUserConfig" ID="Pip.__getUserConfig"></a> +<h4>Pip.__getUserConfig</h4> +<b>__getUserConfig</b>(<i></i>) +<p> + Private method to get the name of the user configuration file. +</p><dl> +<dt>Returns:</dt> +<dd> +path of the user configuration file (string) +</dd> +</dl><a NAME="Pip.__getVirtualenvConfig" ID="Pip.__getVirtualenvConfig"></a> +<h4>Pip.__getVirtualenvConfig</h4> +<b>__getVirtualenvConfig</b>(<i></i>) +<p> + Private method to get the name of the virtualenv configuration file. +</p><dl> +<dt>Returns:</dt> +<dd> +path of the virtualenv configuration file (string) +</dd> +</dl><a NAME="Pip.__handleTearOffMenu" ID="Pip.__handleTearOffMenu"></a> +<h4>Pip.__handleTearOffMenu</h4> +<b>__handleTearOffMenu</b>(<i>pip</i>) +<p> + Private slot to handle a change of the pip executable. +</p><dl> +<dt><i>pip</i> (str)</dt> +<dd> +path of the pip executable +</dd> +</dl><a NAME="Pip.__installPackages" ID="Pip.__installPackages"></a> +<h4>Pip.__installPackages</h4> +<b>__installPackages</b>(<i></i>) +<p> + Private slot to install packages to be given by the user. +</p><a NAME="Pip.__installPip" ID="Pip.__installPip"></a> +<h4>Pip.__installPip</h4> +<b>__installPip</b>(<i></i>) +<p> + Private slot to install pip. +</p><a NAME="Pip.__installRequirements" ID="Pip.__installRequirements"></a> +<h4>Pip.__installRequirements</h4> +<b>__installRequirements</b>(<i></i>) +<p> + Private slot to install packages as given in a requirements file. +</p><a NAME="Pip.__listOutdatedPackages" ID="Pip.__listOutdatedPackages"></a> +<h4>Pip.__listOutdatedPackages</h4> +<b>__listOutdatedPackages</b>(<i></i>) +<p> + Private slot to list all installed, up-to-date packages. +</p><a NAME="Pip.__listPackages" ID="Pip.__listPackages"></a> +<h4>Pip.__listPackages</h4> +<b>__listPackages</b>(<i></i>) +<p> + Private slot to list all installed packages. +</p><a NAME="Pip.__listUptodatePackages" ID="Pip.__listUptodatePackages"></a> +<h4>Pip.__listUptodatePackages</h4> +<b>__listUptodatePackages</b>(<i></i>) +<p> + Private slot to list all installed, up-to-date packages. +</p><a NAME="Pip.__pipConfigure" ID="Pip.__pipConfigure"></a> +<h4>Pip.__pipConfigure</h4> +<b>__pipConfigure</b>(<i></i>) +<p> + Private slot to open the configuration page. +</p><a NAME="Pip.__repairPip" ID="Pip.__repairPip"></a> +<h4>Pip.__repairPip</h4> +<b>__repairPip</b>(<i></i>) +<a NAME="Pip.__searchPyPI" ID="Pip.__searchPyPI"></a> +<h4>Pip.__searchPyPI</h4> +<b>__searchPyPI</b>(<i></i>) +<p> + Private slot to search the Python Package Index. +</p><a NAME="Pip.__selectPipExecutable" ID="Pip.__selectPipExecutable"></a> +<h4>Pip.__selectPipExecutable</h4> +<b>__selectPipExecutable</b>(<i></i>) +<p> + Private method to select the pip executable to be used. +</p><a NAME="Pip.__uninstallPackages" ID="Pip.__uninstallPackages"></a> +<h4>Pip.__uninstallPackages</h4> +<b>__uninstallPackages</b>(<i></i>) +<p> + Private slot to uninstall packages to be given by the user. +</p><a NAME="Pip.__uninstallRequirements" ID="Pip.__uninstallRequirements"></a> +<h4>Pip.__uninstallRequirements</h4> +<b>__uninstallRequirements</b>(<i></i>) +<p> + Private slot to uninstall packages as given in a requirements file. +</p><a NAME="Pip.__upgradePackages" ID="Pip.__upgradePackages"></a> +<h4>Pip.__upgradePackages</h4> +<b>__upgradePackages</b>(<i></i>) +<p> + Private slot to upgrade packages to be given by the user. +</p><a NAME="Pip.getMenu" ID="Pip.getMenu"></a> +<h4>Pip.getMenu</h4> +<b>getMenu</b>(<i>name</i>) +<p> + Public method to get a reference to the requested menu. +</p><dl> +<dt><i>name</i></dt> +<dd> +name of the menu (string) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +reference to the menu (QMenu) or None, if no + menu with the given name exists +</dd> +</dl><a NAME="Pip.getMenuNames" ID="Pip.getMenuNames"></a> +<h4>Pip.getMenuNames</h4> +<b>getMenuNames</b>(<i></i>) +<p> + Public method to get the names of all menus. +</p><dl> +<dt>Returns:</dt> +<dd> +menu names (list of string) +</dd> +</dl><a NAME="Pip.initActions" ID="Pip.initActions"></a> +<h4>Pip.initActions</h4> +<b>initActions</b>(<i></i>) +<p> + Public method to define the Django actions. +</p><a NAME="Pip.initMenu" ID="Pip.initMenu"></a> +<h4>Pip.initMenu</h4> +<b>initMenu</b>(<i></i>) +<p> + Public slot to initialize the Django menu. +</p><dl> +<dt>Returns:</dt> +<dd> +the menu generated (QMenu) +</dd> +</dl><a NAME="Pip.installPackages" ID="Pip.installPackages"></a> +<h4>Pip.installPackages</h4> +<b>installPackages</b>(<i>packages, cmd=""</i>) +<p> + Public method to install the given list of packages. +</p><dl> +<dt><i>packages</i></dt> +<dd> +list of packages to install (list of string) +</dd><dt><i>cmd</i></dt> +<dd> +pip command to be used (string) +</dd> +</dl><a NAME="Pip.runProcess" ID="Pip.runProcess"></a> +<h4>Pip.runProcess</h4> +<b>runProcess</b>(<i>args, cmd=""</i>) +<p> + Public method to execute the current pip with the given arguments. +</p><p> + The selected pip executable is called with the given arguments and + waited for its end. +</p><dl> +<dt><i>args</i></dt> +<dd> +list of command line arguments (list of string) +</dd><dt><i>cmd</i></dt> +<dd> +pip command to be used (string) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +tuple containing a flag indicating success and the output + of the process (string) +</dd> +</dl><a NAME="Pip.uninstallPackages" ID="Pip.uninstallPackages"></a> +<h4>Pip.uninstallPackages</h4> +<b>uninstallPackages</b>(<i>packages, cmd=""</i>) +<p> + Public method to uninstall the given list of packages. +</p><dl> +<dt><i>packages</i></dt> +<dd> +list of packages to uninstall (list of string) +</dd><dt><i>cmd</i></dt> +<dd> +pip command to be used (string) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating a successful execution (boolean) +</dd> +</dl><a NAME="Pip.upgradePackages" ID="Pip.upgradePackages"></a> +<h4>Pip.upgradePackages</h4> +<b>upgradePackages</b>(<i>packages, cmd=""</i>) +<p> + Public method to upgrade the given list of packages. +</p><dl> +<dt><i>packages</i></dt> +<dd> +list of packages to upgrade (list of string) +</dd><dt><i>cmd</i></dt> +<dd> +pip command to be used (string) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating a successful execution (boolean) +</dd> +</dl><a NAME="Pip.upgradePip" ID="Pip.upgradePip"></a> +<h4>Pip.upgradePip</h4> +<b>upgradePip</b>(<i>pip=""</i>) +<p> + Public method to upgrade pip itself. +</p><dl> +<dt><i>pip</i> (str)</dt> +<dd> +pip command to be used +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating a successful execution +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,218 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog</h1> +<p> +Module implementing a dialog showing the output of a pip command. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipDialog">PipDialog</a></td> +<td>Class implementing a dialog showing the output of a pip command.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipDialog" ID="PipDialog"></a> +<h2>PipDialog</h2> +<p> + Class implementing a dialog showing the output of a pip command. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipDialog.__init__">PipDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipDialog.__addOutput">__addOutput</a></td> +<td>Private method to add some text to the output pane.</td> +</tr><tr> +<td><a href="#PipDialog.__finish">__finish</a></td> +<td>Private slot called when the process finished or the user pressed the button.</td> +</tr><tr> +<td><a href="#PipDialog.__procFinished">__procFinished</a></td> +<td>Private slot connected to the finished signal.</td> +</tr><tr> +<td><a href="#PipDialog.__readStderr">__readStderr</a></td> +<td>Private slot to handle the readyReadStandardError signal.</td> +</tr><tr> +<td><a href="#PipDialog.__readStdout">__readStdout</a></td> +<td>Private slot to handle the readyReadStandardOutput signal.</td> +</tr><tr> +<td><a href="#PipDialog.closeEvent">closeEvent</a></td> +<td>Protected slot implementing a close event handler.</td> +</tr><tr> +<td><a href="#PipDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td> +<td>Private slot called by a button of the button box clicked.</td> +</tr><tr> +<td><a href="#PipDialog.startProcess">startProcess</a></td> +<td>Public slot used to start the process.</td> +</tr><tr> +<td><a href="#PipDialog.startProcesses">startProcesses</a></td> +<td>Public method to issue a list of commands to be executed.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipDialog.__init__" ID="PipDialog.__init__"></a> +<h4>PipDialog (Constructor)</h4> +<b>PipDialog</b>(<i>text, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>text</i></dt> +<dd> +text to be shown by the label (string) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipDialog.__addOutput" ID="PipDialog.__addOutput"></a> +<h4>PipDialog.__addOutput</h4> +<b>__addOutput</b>(<i>txt</i>) +<p> + Private method to add some text to the output pane. +</p><dl> +<dt><i>txt</i> (str)</dt> +<dd> +text to be added +</dd> +</dl><a NAME="PipDialog.__finish" ID="PipDialog.__finish"></a> +<h4>PipDialog.__finish</h4> +<b>__finish</b>(<i></i>) +<p> + Private slot called when the process finished or the user pressed + the button. +</p><a NAME="PipDialog.__procFinished" ID="PipDialog.__procFinished"></a> +<h4>PipDialog.__procFinished</h4> +<b>__procFinished</b>(<i>exitCode, exitStatus</i>) +<p> + Private slot connected to the finished signal. +</p><dl> +<dt><i>exitCode</i></dt> +<dd> +exit code of the process (integer) +</dd><dt><i>exitStatus</i></dt> +<dd> +exit status of the process (QProcess.ExitStatus) +</dd> +</dl><a NAME="PipDialog.__readStderr" ID="PipDialog.__readStderr"></a> +<h4>PipDialog.__readStderr</h4> +<b>__readStderr</b>(<i></i>) +<p> + Private slot to handle the readyReadStandardError signal. +</p><p> + It reads the error output of the process and inserts it into the + error pane. +</p><a NAME="PipDialog.__readStdout" ID="PipDialog.__readStdout"></a> +<h4>PipDialog.__readStdout</h4> +<b>__readStdout</b>(<i></i>) +<p> + Private slot to handle the readyReadStandardOutput signal. +</p><p> + It reads the output of the process, formats it and inserts it into + the contents pane. +</p><a NAME="PipDialog.closeEvent" ID="PipDialog.closeEvent"></a> +<h4>PipDialog.closeEvent</h4> +<b>closeEvent</b>(<i>e</i>) +<p> + Protected slot implementing a close event handler. +</p><dl> +<dt><i>e</i></dt> +<dd> +close event (QCloseEvent) +</dd> +</dl><a NAME="PipDialog.on_buttonBox_clicked" ID="PipDialog.on_buttonBox_clicked"></a> +<h4>PipDialog.on_buttonBox_clicked</h4> +<b>on_buttonBox_clicked</b>(<i>button</i>) +<p> + Private slot called by a button of the button box clicked. +</p><dl> +<dt><i>button</i></dt> +<dd> +button that was clicked (QAbstractButton) +</dd> +</dl><a NAME="PipDialog.startProcess" ID="PipDialog.startProcess"></a> +<h4>PipDialog.startProcess</h4> +<b>startProcess</b>(<i>cmd, args, showArgs=True</i>) +<p> + Public slot used to start the process. +</p><dl> +<dt><i>cmd</i></dt> +<dd> +name of the pip executable to be used (string) +</dd><dt><i>args</i></dt> +<dd> +list of arguments for the process (list of strings) +</dd><dt><i>showArgs=</i></dt> +<dd> +flag indicating to show the arguments (boolean) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating a successful start of the process +</dd> +</dl><a NAME="PipDialog.startProcesses" ID="PipDialog.startProcesses"></a> +<h4>PipDialog.startProcesses</h4> +<b>startProcesses</b>(<i>processParams</i>) +<p> + Public method to issue a list of commands to be executed. +</p><dl> +<dt><i>processParams</i> (list of tuples of str and list of str)</dt> +<dd> +list of tuples containing the command + and arguments +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +flag indicating a successful start of the first process +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,257 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog</h1> +<p> +Module implementing a dialog to generate a requirements file. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipFreezeDialog">PipFreezeDialog</a></td> +<td>Class implementing a dialog to generate a requirements file.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipFreezeDialog" ID="PipFreezeDialog"></a> +<h2>PipFreezeDialog</h2> +<p> + Class implementing a dialog to generate a requirements file. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipFreezeDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipFreezeDialog.__init__">PipFreezeDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipFreezeDialog.__refresh">__refresh</a></td> +<td>Private slot to refresh the displayed list.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.__updateButtons">__updateButtons</a></td> +<td>Private method to set the state of the various buttons.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.__writeToFile">__writeToFile</a></td> +<td>Private method to write the requirements text to a file.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.closeEvent">closeEvent</a></td> +<td>Protected slot implementing a close event handler.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td> +<td>Private slot called by a button of the button box clicked.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_copyButton_clicked">on_copyButton_clicked</a></td> +<td>Private slot to copy the requirements text to the clipboard.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_fileButton_clicked">on_fileButton_clicked</a></td> +<td>Private slot to enter the requirements file via a file selection dialog.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_insertButton_clicked">on_insertButton_clicked</a></td> +<td>Private slot to insert the requirements text at the cursor position of the current editor.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_localCheckBox_clicked">on_localCheckBox_clicked</a></td> +<td>Private slot handling the switching of the local mode.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_pipComboBox_activated">on_pipComboBox_activated</a></td> +<td>Private slot handling the selection of a pip executable.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_replaceAllButton_clicked">on_replaceAllButton_clicked</a></td> +<td>Private slot to replace the text of the current editor with the requirements text.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_replaceSelectionButton_clicked">on_replaceSelectionButton_clicked</a></td> +<td>Private slot to replace the selected text of the current editor with the requirements text.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_requirementsEdit_textChanged">on_requirementsEdit_textChanged</a></td> +<td>Private slot handling changes of the requirements text.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_requirementsFileEdit_textChanged">on_requirementsFileEdit_textChanged</a></td> +<td>Private slot handling a change of the requirements file name.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_saveButton_clicked">on_saveButton_clicked</a></td> +<td>Private slot to save the requirements text to the requirements file.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.on_saveToButton_clicked">on_saveToButton_clicked</a></td> +<td>Private slot to write the requirements text to a new file.</td> +</tr><tr> +<td><a href="#PipFreezeDialog.start">start</a></td> +<td>Public method to start the command.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipFreezeDialog.__init__" ID="PipFreezeDialog.__init__"></a> +<h4>PipFreezeDialog (Constructor)</h4> +<b>PipFreezeDialog</b>(<i>pip, plugin, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>pip</i></dt> +<dd> +reference to the master object (Pip) +</dd><dt><i>plugin</i></dt> +<dd> +reference to the plugin object (ToolPipPlugin) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipFreezeDialog.__refresh" ID="PipFreezeDialog.__refresh"></a> +<h4>PipFreezeDialog.__refresh</h4> +<b>__refresh</b>(<i></i>) +<p> + Private slot to refresh the displayed list. +</p><a NAME="PipFreezeDialog.__updateButtons" ID="PipFreezeDialog.__updateButtons"></a> +<h4>PipFreezeDialog.__updateButtons</h4> +<b>__updateButtons</b>(<i></i>) +<p> + Private method to set the state of the various buttons. +</p><a NAME="PipFreezeDialog.__writeToFile" ID="PipFreezeDialog.__writeToFile"></a> +<h4>PipFreezeDialog.__writeToFile</h4> +<b>__writeToFile</b>(<i>fileName</i>) +<p> + Private method to write the requirements text to a file. +</p><dl> +<dt><i>fileName</i></dt> +<dd> +name of the file to write to (string) +</dd> +</dl><a NAME="PipFreezeDialog.closeEvent" ID="PipFreezeDialog.closeEvent"></a> +<h4>PipFreezeDialog.closeEvent</h4> +<b>closeEvent</b>(<i>e</i>) +<p> + Protected slot implementing a close event handler. +</p><dl> +<dt><i>e</i></dt> +<dd> +close event (QCloseEvent) +</dd> +</dl><a NAME="PipFreezeDialog.on_buttonBox_clicked" ID="PipFreezeDialog.on_buttonBox_clicked"></a> +<h4>PipFreezeDialog.on_buttonBox_clicked</h4> +<b>on_buttonBox_clicked</b>(<i>button</i>) +<p> + Private slot called by a button of the button box clicked. +</p><dl> +<dt><i>button</i></dt> +<dd> +button that was clicked (QAbstractButton) +</dd> +</dl><a NAME="PipFreezeDialog.on_copyButton_clicked" ID="PipFreezeDialog.on_copyButton_clicked"></a> +<h4>PipFreezeDialog.on_copyButton_clicked</h4> +<b>on_copyButton_clicked</b>(<i></i>) +<p> + Private slot to copy the requirements text to the clipboard. +</p><a NAME="PipFreezeDialog.on_fileButton_clicked" ID="PipFreezeDialog.on_fileButton_clicked"></a> +<h4>PipFreezeDialog.on_fileButton_clicked</h4> +<b>on_fileButton_clicked</b>(<i></i>) +<p> + Private slot to enter the requirements file via a file selection + dialog. +</p><a NAME="PipFreezeDialog.on_insertButton_clicked" ID="PipFreezeDialog.on_insertButton_clicked"></a> +<h4>PipFreezeDialog.on_insertButton_clicked</h4> +<b>on_insertButton_clicked</b>(<i></i>) +<p> + Private slot to insert the requirements text at the cursor position + of the current editor. +</p><a NAME="PipFreezeDialog.on_localCheckBox_clicked" ID="PipFreezeDialog.on_localCheckBox_clicked"></a> +<h4>PipFreezeDialog.on_localCheckBox_clicked</h4> +<b>on_localCheckBox_clicked</b>(<i>checked</i>) +<p> + Private slot handling the switching of the local mode. +</p><dl> +<dt><i>checked</i></dt> +<dd> +state of the local check box (boolean) +</dd> +</dl><a NAME="PipFreezeDialog.on_pipComboBox_activated" ID="PipFreezeDialog.on_pipComboBox_activated"></a> +<h4>PipFreezeDialog.on_pipComboBox_activated</h4> +<b>on_pipComboBox_activated</b>(<i>txt</i>) +<p> + Private slot handling the selection of a pip executable. +</p><dl> +<dt><i>txt</i></dt> +<dd> +path of the pip executable (string) +</dd> +</dl><a NAME="PipFreezeDialog.on_replaceAllButton_clicked" ID="PipFreezeDialog.on_replaceAllButton_clicked"></a> +<h4>PipFreezeDialog.on_replaceAllButton_clicked</h4> +<b>on_replaceAllButton_clicked</b>(<i></i>) +<p> + Private slot to replace the text of the current editor with the + requirements text. +</p><a NAME="PipFreezeDialog.on_replaceSelectionButton_clicked" ID="PipFreezeDialog.on_replaceSelectionButton_clicked"></a> +<h4>PipFreezeDialog.on_replaceSelectionButton_clicked</h4> +<b>on_replaceSelectionButton_clicked</b>(<i></i>) +<p> + Private slot to replace the selected text of the current editor + with the requirements text. +</p><a NAME="PipFreezeDialog.on_requirementsEdit_textChanged" ID="PipFreezeDialog.on_requirementsEdit_textChanged"></a> +<h4>PipFreezeDialog.on_requirementsEdit_textChanged</h4> +<b>on_requirementsEdit_textChanged</b>(<i></i>) +<p> + Private slot handling changes of the requirements text. +</p><a NAME="PipFreezeDialog.on_requirementsFileEdit_textChanged" ID="PipFreezeDialog.on_requirementsFileEdit_textChanged"></a> +<h4>PipFreezeDialog.on_requirementsFileEdit_textChanged</h4> +<b>on_requirementsFileEdit_textChanged</b>(<i>txt</i>) +<p> + Private slot handling a change of the requirements file name. +</p><dl> +<dt><i>txt</i></dt> +<dd> +name of the requirements file (string) +</dd> +</dl><a NAME="PipFreezeDialog.on_saveButton_clicked" ID="PipFreezeDialog.on_saveButton_clicked"></a> +<h4>PipFreezeDialog.on_saveButton_clicked</h4> +<b>on_saveButton_clicked</b>(<i></i>) +<p> + Private slot to save the requirements text to the requirements file. +</p><a NAME="PipFreezeDialog.on_saveToButton_clicked" ID="PipFreezeDialog.on_saveToButton_clicked"></a> +<h4>PipFreezeDialog.on_saveToButton_clicked</h4> +<b>on_saveToButton_clicked</b>(<i></i>) +<p> + Private slot to write the requirements text to a new file. +</p><a NAME="PipFreezeDialog.start" ID="PipFreezeDialog.start"></a> +<h4>PipFreezeDialog.start</h4> +<b>start</b>(<i></i>) +<p> + Public method to start the command. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,319 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog</h1> +<p> +Module implementing a dialog to list installed packages. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipListDialog">PipListDialog</a></td> +<td>Class implementing a dialog to list installed packages.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipListDialog" ID="PipListDialog"></a> +<h2>PipListDialog</h2> +<p> + Class implementing a dialog to list installed packages. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipListDialog +<h3>Class Attributes</h3> +<table> +<tr><td>CommandArguments</td></tr><tr><td>ShowProcessClassifiersMode</td></tr><tr><td>ShowProcessEntryPointsMode</td></tr><tr><td>ShowProcessFilesListMode</td></tr><tr><td>ShowProcessGeneralMode</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipListDialog.__init__">PipListDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipListDialog.__executeUpgradePackages">__executeUpgradePackages</a></td> +<td>Private method to execute the pip upgrade command.</td> +</tr><tr> +<td><a href="#PipListDialog.__finish">__finish</a></td> +<td>Private slot called when the process finished or the user pressed the cancel button.</td> +</tr><tr> +<td><a href="#PipListDialog.__procFinished">__procFinished</a></td> +<td>Private slot connected to the finished signal.</td> +</tr><tr> +<td><a href="#PipListDialog.__processOutput">__processOutput</a></td> +<td>Private method to process the captured output.</td> +</tr><tr> +<td><a href="#PipListDialog.__readStderr">__readStderr</a></td> +<td>Private slot to handle the readyReadStandardError signal.</td> +</tr><tr> +<td><a href="#PipListDialog.__readStdout">__readStdout</a></td> +<td>Private slot to handle the readyReadStandardOutput signal.</td> +</tr><tr> +<td><a href="#PipListDialog.__refresh">__refresh</a></td> +<td>Private slot to refresh the displayed list.</td> +</tr><tr> +<td><a href="#PipListDialog.__stopProcess">__stopProcess</a></td> +<td>Private slot to stop the running process.</td> +</tr><tr> +<td><a href="#PipListDialog.__uninstallPackages">__uninstallPackages</a></td> +<td>Private slot to uninstall the selected packages.</td> +</tr><tr> +<td><a href="#PipListDialog.__upgradeAllPackages">__upgradeAllPackages</a></td> +<td>Private slot to upgrade all listed packages.</td> +</tr><tr> +<td><a href="#PipListDialog.__upgradePackages">__upgradePackages</a></td> +<td>Private slot to upgrade the selected packages.</td> +</tr><tr> +<td><a href="#PipListDialog.__upgradePip">__upgradePip</a></td> +<td>Private slot to upgrade pip itself.</td> +</tr><tr> +<td><a href="#PipListDialog.closeEvent">closeEvent</a></td> +<td>Protected slot implementing a close event handler.</td> +</tr><tr> +<td><a href="#PipListDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td> +<td>Private slot called by a button of the button box clicked.</td> +</tr><tr> +<td><a href="#PipListDialog.on_installedFilesCheckBox_clicked">on_installedFilesCheckBox_clicked</a></td> +<td>Private slot to handle a change of the installed files information checkbox.</td> +</tr><tr> +<td><a href="#PipListDialog.on_localCheckBox_clicked">on_localCheckBox_clicked</a></td> +<td>Private slot handling the switching of the local mode.</td> +</tr><tr> +<td><a href="#PipListDialog.on_notRequiredCheckBox_clicked">on_notRequiredCheckBox_clicked</a></td> +<td>Private slot handling the switching of the 'not required' mode.</td> +</tr><tr> +<td><a href="#PipListDialog.on_packageList_itemSelectionChanged">on_packageList_itemSelectionChanged</a></td> +<td>Private slot handling the selection of a package.</td> +</tr><tr> +<td><a href="#PipListDialog.on_pipComboBox_activated">on_pipComboBox_activated</a></td> +<td>Private slot handling the selection of a pip executable.</td> +</tr><tr> +<td><a href="#PipListDialog.on_verboseCheckBox_clicked">on_verboseCheckBox_clicked</a></td> +<td>Private slot to handle a change of the verbose package information checkbox.</td> +</tr><tr> +<td><a href="#PipListDialog.start">start</a></td> +<td>Public method to start the command.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipListDialog.__init__" ID="PipListDialog.__init__"></a> +<h4>PipListDialog (Constructor)</h4> +<b>PipListDialog</b>(<i>pip, mode, plugin, title, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>pip</i></dt> +<dd> +reference to the master object (Pip) +</dd><dt><i>mode</i></dt> +<dd> +list command mode (string; one of 'list', + 'uptodate', 'outdated') +</dd><dt><i>plugin</i></dt> +<dd> +reference to the plugin object (ToolPipPlugin) +</dd><dt><i>title</i></dt> +<dd> +title of the dialog (string) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipListDialog.__executeUpgradePackages" ID="PipListDialog.__executeUpgradePackages"></a> +<h4>PipListDialog.__executeUpgradePackages</h4> +<b>__executeUpgradePackages</b>(<i>packages</i>) +<p> + Private method to execute the pip upgrade command. +</p><dl> +<dt><i>packages</i> (list of str)</dt> +<dd> +list of package names to be upgraded +</dd> +</dl><a NAME="PipListDialog.__finish" ID="PipListDialog.__finish"></a> +<h4>PipListDialog.__finish</h4> +<b>__finish</b>(<i></i>) +<p> + Private slot called when the process finished or the user pressed + the cancel button. +</p><a NAME="PipListDialog.__procFinished" ID="PipListDialog.__procFinished"></a> +<h4>PipListDialog.__procFinished</h4> +<b>__procFinished</b>(<i>exitCode, exitStatus</i>) +<p> + Private slot connected to the finished signal. +</p><dl> +<dt><i>exitCode</i></dt> +<dd> +exit code of the process (integer) +</dd><dt><i>exitStatus</i></dt> +<dd> +exit status of the process (QProcess.ExitStatus) +</dd> +</dl><a NAME="PipListDialog.__processOutput" ID="PipListDialog.__processOutput"></a> +<h4>PipListDialog.__processOutput</h4> +<b>__processOutput</b>(<i></i>) +<p> + Private method to process the captured output. +</p><a NAME="PipListDialog.__readStderr" ID="PipListDialog.__readStderr"></a> +<h4>PipListDialog.__readStderr</h4> +<b>__readStderr</b>(<i></i>) +<p> + Private slot to handle the readyReadStandardError signal. +</p><p> + It reads the error output of the process and inserts it into the + error pane. +</p><a NAME="PipListDialog.__readStdout" ID="PipListDialog.__readStdout"></a> +<h4>PipListDialog.__readStdout</h4> +<b>__readStdout</b>(<i></i>) +<p> + Private slot to handle the readyReadStandardOutput signal. +</p><p> + It reads the output of the process, formats it and inserts it into + the contents pane. +</p><a NAME="PipListDialog.__refresh" ID="PipListDialog.__refresh"></a> +<h4>PipListDialog.__refresh</h4> +<b>__refresh</b>(<i></i>) +<p> + Private slot to refresh the displayed list. +</p><a NAME="PipListDialog.__stopProcess" ID="PipListDialog.__stopProcess"></a> +<h4>PipListDialog.__stopProcess</h4> +<b>__stopProcess</b>(<i></i>) +<p> + Private slot to stop the running process. +</p><a NAME="PipListDialog.__uninstallPackages" ID="PipListDialog.__uninstallPackages"></a> +<h4>PipListDialog.__uninstallPackages</h4> +<b>__uninstallPackages</b>(<i></i>) +<p> + Private slot to uninstall the selected packages. +</p><a NAME="PipListDialog.__upgradeAllPackages" ID="PipListDialog.__upgradeAllPackages"></a> +<h4>PipListDialog.__upgradeAllPackages</h4> +<b>__upgradeAllPackages</b>(<i></i>) +<p> + Private slot to upgrade all listed packages. +</p><a NAME="PipListDialog.__upgradePackages" ID="PipListDialog.__upgradePackages"></a> +<h4>PipListDialog.__upgradePackages</h4> +<b>__upgradePackages</b>(<i></i>) +<p> + Private slot to upgrade the selected packages. +</p><a NAME="PipListDialog.__upgradePip" ID="PipListDialog.__upgradePip"></a> +<h4>PipListDialog.__upgradePip</h4> +<b>__upgradePip</b>(<i></i>) +<p> + Private slot to upgrade pip itself. +</p><a NAME="PipListDialog.closeEvent" ID="PipListDialog.closeEvent"></a> +<h4>PipListDialog.closeEvent</h4> +<b>closeEvent</b>(<i>e</i>) +<p> + Protected slot implementing a close event handler. +</p><dl> +<dt><i>e</i></dt> +<dd> +close event (QCloseEvent) +</dd> +</dl><a NAME="PipListDialog.on_buttonBox_clicked" ID="PipListDialog.on_buttonBox_clicked"></a> +<h4>PipListDialog.on_buttonBox_clicked</h4> +<b>on_buttonBox_clicked</b>(<i>button</i>) +<p> + Private slot called by a button of the button box clicked. +</p><dl> +<dt><i>button</i></dt> +<dd> +button that was clicked (QAbstractButton) +</dd> +</dl><a NAME="PipListDialog.on_installedFilesCheckBox_clicked" ID="PipListDialog.on_installedFilesCheckBox_clicked"></a> +<h4>PipListDialog.on_installedFilesCheckBox_clicked</h4> +<b>on_installedFilesCheckBox_clicked</b>(<i>checked</i>) +<p> + Private slot to handle a change of the installed files information + checkbox. +</p><dl> +<dt><i>checked</i> (bool)</dt> +<dd> +state of the checkbox +</dd> +</dl><a NAME="PipListDialog.on_localCheckBox_clicked" ID="PipListDialog.on_localCheckBox_clicked"></a> +<h4>PipListDialog.on_localCheckBox_clicked</h4> +<b>on_localCheckBox_clicked</b>(<i>checked</i>) +<p> + Private slot handling the switching of the local mode. +</p><dl> +<dt><i>checked</i></dt> +<dd> +state of the local check box (boolean) +</dd> +</dl><a NAME="PipListDialog.on_notRequiredCheckBox_clicked" ID="PipListDialog.on_notRequiredCheckBox_clicked"></a> +<h4>PipListDialog.on_notRequiredCheckBox_clicked</h4> +<b>on_notRequiredCheckBox_clicked</b>(<i>checked</i>) +<p> + Private slot handling the switching of the 'not required' mode. +</p><dl> +<dt><i>checked</i></dt> +<dd> +state of the 'not required' check box (boolean) +</dd> +</dl><a NAME="PipListDialog.on_packageList_itemSelectionChanged" ID="PipListDialog.on_packageList_itemSelectionChanged"></a> +<h4>PipListDialog.on_packageList_itemSelectionChanged</h4> +<b>on_packageList_itemSelectionChanged</b>(<i></i>) +<p> + Private slot handling the selection of a package. +</p><a NAME="PipListDialog.on_pipComboBox_activated" ID="PipListDialog.on_pipComboBox_activated"></a> +<h4>PipListDialog.on_pipComboBox_activated</h4> +<b>on_pipComboBox_activated</b>(<i>txt</i>) +<p> + Private slot handling the selection of a pip executable. +</p><dl> +<dt><i>txt</i></dt> +<dd> +path of the pip executable (string) +</dd> +</dl><a NAME="PipListDialog.on_verboseCheckBox_clicked" ID="PipListDialog.on_verboseCheckBox_clicked"></a> +<h4>PipListDialog.on_verboseCheckBox_clicked</h4> +<b>on_verboseCheckBox_clicked</b>(<i>checked</i>) +<p> + Private slot to handle a change of the verbose package information + checkbox. +</p><dl> +<dt><i>checked</i> (bool)</dt> +<dd> +state of the checkbox +</dd> +</dl><a NAME="PipListDialog.start" ID="PipListDialog.start"></a> +<h4>PipListDialog.start</h4> +<b>start</b>(<i></i>) +<p> + Public method to start the command. +</p> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,183 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog</h1> +<p> +Module implementing a dialog to show details about a package. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipPackageDetailsDialog">PipPackageDetailsDialog</a></td> +<td>Class documentation goes here.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipPackageDetailsDialog" ID="PipPackageDetailsDialog"></a> +<h2>PipPackageDetailsDialog</h2> +<p> + Class documentation goes here. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipPackageDetailsDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipPackageDetailsDialog.__init__">PipPackageDetailsDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipPackageDetailsDialog.__formatSize">__formatSize</a></td> +<td>Private slot to format the size.</td> +</tr><tr> +<td><a href="#PipPackageDetailsDialog.__formatUploadDate">__formatUploadDate</a></td> +<td>Private method to format the upload date.</td> +</tr><tr> +<td><a href="#PipPackageDetailsDialog.__populateDetails">__populateDetails</a></td> +<td>Private method to populate the details tab.</td> +</tr><tr> +<td><a href="#PipPackageDetailsDialog.__populateDownloadUrls">__populateDownloadUrls</a></td> +<td>Private method to populate the download URLs tab.</td> +</tr><tr> +<td><a href="#PipPackageDetailsDialog.__populateRequiresProvides">__populateRequiresProvides</a></td> +<td>Private method to populate the requires/provides tab.</td> +</tr><tr> +<td><a href="#PipPackageDetailsDialog.__sanitize">__sanitize</a></td> +<td>Private method to clean-up the given text.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipPackageDetailsDialog.__init__" ID="PipPackageDetailsDialog.__init__"></a> +<h4>PipPackageDetailsDialog (Constructor)</h4> +<b>PipPackageDetailsDialog</b>(<i>detailsData, downloadsData, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>detailsData</i></dt> +<dd> +package details (dict) +</dd><dt><i>downloadsData</i></dt> +<dd> +downloads information (dict) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipPackageDetailsDialog.__formatSize" ID="PipPackageDetailsDialog.__formatSize"></a> +<h4>PipPackageDetailsDialog.__formatSize</h4> +<b>__formatSize</b>(<i>size</i>) +<p> + Private slot to format the size. +</p><dl> +<dt><i>size</i></dt> +<dd> +size to be formatted (integer) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +formatted size (string) +</dd> +</dl><a NAME="PipPackageDetailsDialog.__formatUploadDate" ID="PipPackageDetailsDialog.__formatUploadDate"></a> +<h4>PipPackageDetailsDialog.__formatUploadDate</h4> +<b>__formatUploadDate</b>(<i>datetime</i>) +<p> + Private method to format the upload date. +</p><dl> +<dt><i>datetime</i></dt> +<dd> +upload date and time (xmlrpc.DateTime) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +formatted date string (string) +</dd> +</dl><a NAME="PipPackageDetailsDialog.__populateDetails" ID="PipPackageDetailsDialog.__populateDetails"></a> +<h4>PipPackageDetailsDialog.__populateDetails</h4> +<b>__populateDetails</b>(<i>detailsData</i>) +<p> + Private method to populate the details tab. +</p><dl> +<dt><i>detailsData</i></dt> +<dd> +package details (dict) +</dd> +</dl><a NAME="PipPackageDetailsDialog.__populateDownloadUrls" ID="PipPackageDetailsDialog.__populateDownloadUrls"></a> +<h4>PipPackageDetailsDialog.__populateDownloadUrls</h4> +<b>__populateDownloadUrls</b>(<i>downloadsData</i>) +<p> + Private method to populate the download URLs tab. +</p><dl> +<dt><i>downloadsData</i></dt> +<dd> +downloads information (dict) +</dd> +</dl><a NAME="PipPackageDetailsDialog.__populateRequiresProvides" ID="PipPackageDetailsDialog.__populateRequiresProvides"></a> +<h4>PipPackageDetailsDialog.__populateRequiresProvides</h4> +<b>__populateRequiresProvides</b>(<i>detailsData</i>) +<p> + Private method to populate the requires/provides tab. +</p><dl> +<dt><i>detailsData</i></dt> +<dd> +package details (dict) +</dd> +</dl><a NAME="PipPackageDetailsDialog.__sanitize" ID="PipPackageDetailsDialog.__sanitize"></a> +<h4>PipPackageDetailsDialog.__sanitize</h4> +<b>__sanitize</b>(<i>text, forUrl=False</i>) +<p> + Private method to clean-up the given text. +</p><dl> +<dt><i>text</i></dt> +<dd> +raw text (string) +</dd><dt><i>forUrl</i></dt> +<dd> +flag indicating to sanitize an URL text (boolean) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +processed text (string) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,114 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog</h1> +<p> +Module implementing a dialog to enter package specifications. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipPackagesInputDialog">PipPackagesInputDialog</a></td> +<td>Class documentation goes here.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipPackagesInputDialog" ID="PipPackagesInputDialog"></a> +<h2>PipPackagesInputDialog</h2> +<p> + Class documentation goes here. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipPackagesInputDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipPackagesInputDialog.__init__">PipPackagesInputDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipPackagesInputDialog.getData">getData</a></td> +<td>Public method to get the entered data.</td> +</tr><tr> +<td><a href="#PipPackagesInputDialog.on_packagesEdit_textChanged">on_packagesEdit_textChanged</a></td> +<td>Private slot handling entering package names.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipPackagesInputDialog.__init__" ID="PipPackagesInputDialog.__init__"></a> +<h4>PipPackagesInputDialog (Constructor)</h4> +<b>PipPackagesInputDialog</b>(<i>plugin, title, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>plugin</i></dt> +<dd> +reference to the plugin object (ToolPipPlugin) +</dd><dt><i>title</i></dt> +<dd> +dialog title (string) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipPackagesInputDialog.getData" ID="PipPackagesInputDialog.getData"></a> +<h4>PipPackagesInputDialog.getData</h4> +<b>getData</b>(<i></i>) +<p> + Public method to get the entered data. +</p><dl> +<dt>Returns:</dt> +<dd> +tuple with the pip command (string) and the list of + package specifications (list of string) +</dd> +</dl><a NAME="PipPackagesInputDialog.on_packagesEdit_textChanged" ID="PipPackagesInputDialog.on_packagesEdit_textChanged"></a> +<h4>PipPackagesInputDialog.on_packagesEdit_textChanged</h4> +<b>on_packagesEdit_textChanged</b>(<i>txt</i>) +<p> + Private slot handling entering package names. +</p><dl> +<dt><i>txt</i></dt> +<dd> +name of the requirements file (string) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog</h1> +<p> +Module implementing a dialog to enter a requirements file. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipRequirementsSelectionDialog">PipRequirementsSelectionDialog</a></td> +<td>Class implementing a dialog to enter a requirements file.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipRequirementsSelectionDialog" ID="PipRequirementsSelectionDialog"></a> +<h2>PipRequirementsSelectionDialog</h2> +<p> + Class implementing a dialog to enter a requirements file. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipRequirementsSelectionDialog +<h3>Class Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipRequirementsSelectionDialog.__init__">PipRequirementsSelectionDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipRequirementsSelectionDialog.getData">getData</a></td> +<td>Public method to get the entered data.</td> +</tr><tr> +<td><a href="#PipRequirementsSelectionDialog.on_fileButton_clicked">on_fileButton_clicked</a></td> +<td>Private slot to enter the requirements file via a file selection dialog.</td> +</tr><tr> +<td><a href="#PipRequirementsSelectionDialog.on_requirementsEdit_textChanged">on_requirementsEdit_textChanged</a></td> +<td>Private slot handling entering the name of a requirements file.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipRequirementsSelectionDialog.__init__" ID="PipRequirementsSelectionDialog.__init__"></a> +<h4>PipRequirementsSelectionDialog (Constructor)</h4> +<b>PipRequirementsSelectionDialog</b>(<i>plugin, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>plugin</i></dt> +<dd> +reference to the plugin object (ToolPipPlugin) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipRequirementsSelectionDialog.getData" ID="PipRequirementsSelectionDialog.getData"></a> +<h4>PipRequirementsSelectionDialog.getData</h4> +<b>getData</b>(<i></i>) +<p> + Public method to get the entered data. +</p><dl> +<dt>Returns:</dt> +<dd> +tuple with the pip command (string) and the name of the + requirements file (string) +</dd> +</dl><a NAME="PipRequirementsSelectionDialog.on_fileButton_clicked" ID="PipRequirementsSelectionDialog.on_fileButton_clicked"></a> +<h4>PipRequirementsSelectionDialog.on_fileButton_clicked</h4> +<b>on_fileButton_clicked</b>(<i></i>) +<p> + Private slot to enter the requirements file via a file selection + dialog. +</p><a NAME="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged" ID="PipRequirementsSelectionDialog.on_requirementsEdit_textChanged"></a> +<h4>PipRequirementsSelectionDialog.on_requirementsEdit_textChanged</h4> +<b>on_requirementsEdit_textChanged</b>(<i>txt</i>) +<p> + Private slot handling entering the name of a requirements file. +</p><dl> +<dt><i>txt</i></dt> +<dd> +name of the requirements file (string) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,312 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body><a NAME="top" ID="top"></a> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog</h1> +<p> +Module implementing a dialog to search PyPI. +</p> +<h3>Global Attributes</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Classes</h3> +<table> +<tr> +<td><a href="#PipSearchDialog">PipSearchDialog</a></td> +<td>Class implementing a dialog to search PyPI.</td> +</tr> +</table> +<h3>Functions</h3> +<table> +<tr><td>None</td></tr> +</table> +<hr /><hr /> +<a NAME="PipSearchDialog" ID="PipSearchDialog"></a> +<h2>PipSearchDialog</h2> +<p> + Class implementing a dialog to search PyPI. +</p> +<h3>Derived from</h3> +QDialog, Ui_PipSearchDialog +<h3>Class Attributes</h3> +<table> +<tr><td>Stopwords</td></tr><tr><td>VersionRole</td></tr> +</table> +<h3>Class Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<h3>Methods</h3> +<table> +<tr> +<td><a href="#PipSearchDialog.__init__">PipSearchDialog</a></td> +<td>Constructor</td> +</tr><tr> +<td><a href="#PipSearchDialog.__detailsError">__detailsError</a></td> +<td>Private method handling a details error.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__displayPackageDetails">__displayPackageDetails</a></td> +<td>Private method to display the returned package details.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__finish">__finish</a></td> +<td>Private slot performing the finishing actions.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__getPackageDownloadsData">__getPackageDownloadsData</a></td> +<td>Private method to store the details data and get downloads information.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__install">__install</a></td> +<td>Private slot to install the selected packages.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__processSearchResult">__processSearchResult</a></td> +<td>Private method to process the search result data from PyPI.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__score">__score</a></td> +<td>Private method to calculate some score for a search result.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__search">__search</a></td> +<td>Private method to perform the search.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__searchError">__searchError</a></td> +<td>Private method handling a search error.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__showDetails">__showDetails</a></td> +<td>Private slot to show details about the selected package.</td> +</tr><tr> +<td><a href="#PipSearchDialog.__transformHits">__transformHits</a></td> +<td>Private method to convert the list returned from pypi into a packages list.</td> +</tr><tr> +<td><a href="#PipSearchDialog.closeEvent">closeEvent</a></td> +<td>Protected slot implementing a close event handler.</td> +</tr><tr> +<td><a href="#PipSearchDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td> +<td>Private slot called by a button of the button box clicked.</td> +</tr><tr> +<td><a href="#PipSearchDialog.on_resultList_itemActivated">on_resultList_itemActivated</a></td> +<td>Private slot reacting on an item activation.</td> +</tr><tr> +<td><a href="#PipSearchDialog.on_resultList_itemSelectionChanged">on_resultList_itemSelectionChanged</a></td> +<td>Private slot handling changes of the selection.</td> +</tr><tr> +<td><a href="#PipSearchDialog.on_searchButton_clicked">on_searchButton_clicked</a></td> +<td>Private slot handling a press of the search button.</td> +</tr><tr> +<td><a href="#PipSearchDialog.on_searchEdit_textChanged">on_searchEdit_textChanged</a></td> +<td>Private slot handling a change of the search term.</td> +</tr> +</table> +<h3>Static Methods</h3> +<table> +<tr><td>None</td></tr> +</table> +<a NAME="PipSearchDialog.__init__" ID="PipSearchDialog.__init__"></a> +<h4>PipSearchDialog (Constructor)</h4> +<b>PipSearchDialog</b>(<i>pip, plugin, parent=None</i>) +<p> + Constructor +</p><dl> +<dt><i>pip</i></dt> +<dd> +reference to the master object (Pip) +</dd><dt><i>plugin</i></dt> +<dd> +reference to the plugin object (ToolPipPlugin) +</dd><dt><i>parent</i></dt> +<dd> +reference to the parent widget (QWidget) +</dd> +</dl><a NAME="PipSearchDialog.__detailsError" ID="PipSearchDialog.__detailsError"></a> +<h4>PipSearchDialog.__detailsError</h4> +<b>__detailsError</b>(<i>errorCode, errorString</i>) +<p> + Private method handling a details error. +</p><dl> +<dt><i>errorCode</i></dt> +<dd> +code of the error (integer) +</dd><dt><i>errorString</i></dt> +<dd> +error message (string) +</dd> +</dl><a NAME="PipSearchDialog.__displayPackageDetails" ID="PipSearchDialog.__displayPackageDetails"></a> +<h4>PipSearchDialog.__displayPackageDetails</h4> +<b>__displayPackageDetails</b>(<i>data</i>) +<p> + Private method to display the returned package details. +</p><dl> +<dt><i>data</i></dt> +<dd> +result data (tuple) with downloads information in the first + element +</dd> +</dl><a NAME="PipSearchDialog.__finish" ID="PipSearchDialog.__finish"></a> +<h4>PipSearchDialog.__finish</h4> +<b>__finish</b>(<i></i>) +<p> + Private slot performing the finishing actions. +</p><a NAME="PipSearchDialog.__getPackageDownloadsData" ID="PipSearchDialog.__getPackageDownloadsData"></a> +<h4>PipSearchDialog.__getPackageDownloadsData</h4> +<b>__getPackageDownloadsData</b>(<i>packageVersion, data</i>) +<p> + Private method to store the details data and get downloads + information. +</p><dl> +<dt><i>packageVersion</i> (str)</dt> +<dd> +version info +</dd><dt><i>data</i> (tuple)</dt> +<dd> +result data with package details in the first + element +</dd> +</dl><a NAME="PipSearchDialog.__install" ID="PipSearchDialog.__install"></a> +<h4>PipSearchDialog.__install</h4> +<b>__install</b>(<i></i>) +<p> + Private slot to install the selected packages. +</p><a NAME="PipSearchDialog.__processSearchResult" ID="PipSearchDialog.__processSearchResult"></a> +<h4>PipSearchDialog.__processSearchResult</h4> +<b>__processSearchResult</b>(<i>data</i>) +<p> + Private method to process the search result data from PyPI. +</p><dl> +<dt><i>data</i></dt> +<dd> +result data (tuple) with hits in the first element +</dd> +</dl><a NAME="PipSearchDialog.__score" ID="PipSearchDialog.__score"></a> +<h4>PipSearchDialog.__score</h4> +<b>__score</b>(<i>name, summary</i>) +<p> + Private method to calculate some score for a search result. +</p><dl> +<dt><i>name</i> (str)</dt> +<dd> +name of the returned package +</dd><dt><i>summary</i> (str)</dt> +<dd> +summary text for the package +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +score value +</dd> +</dl><dl> +<dt>Return Type:</dt> +<dd> +int +</dd> +</dl><a NAME="PipSearchDialog.__search" ID="PipSearchDialog.__search"></a> +<h4>PipSearchDialog.__search</h4> +<b>__search</b>(<i></i>) +<p> + Private method to perform the search. +</p><a NAME="PipSearchDialog.__searchError" ID="PipSearchDialog.__searchError"></a> +<h4>PipSearchDialog.__searchError</h4> +<b>__searchError</b>(<i>errorCode, errorString</i>) +<p> + Private method handling a search error. +</p><dl> +<dt><i>errorCode</i></dt> +<dd> +code of the error (integer) +</dd><dt><i>errorString</i></dt> +<dd> +error message (string) +</dd> +</dl><a NAME="PipSearchDialog.__showDetails" ID="PipSearchDialog.__showDetails"></a> +<h4>PipSearchDialog.__showDetails</h4> +<b>__showDetails</b>(<i></i>) +<p> + Private slot to show details about the selected package. +</p><a NAME="PipSearchDialog.__transformHits" ID="PipSearchDialog.__transformHits"></a> +<h4>PipSearchDialog.__transformHits</h4> +<b>__transformHits</b>(<i>hits</i>) +<p> + Private method to convert the list returned from pypi into a + packages list. +</p><dl> +<dt><i>hits</i></dt> +<dd> +list returned from pypi (list of dict) +</dd> +</dl><dl> +<dt>Returns:</dt> +<dd> +list of packages (list of dict) +</dd> +</dl><a NAME="PipSearchDialog.closeEvent" ID="PipSearchDialog.closeEvent"></a> +<h4>PipSearchDialog.closeEvent</h4> +<b>closeEvent</b>(<i>e</i>) +<p> + Protected slot implementing a close event handler. +</p><dl> +<dt><i>e</i></dt> +<dd> +close event (QCloseEvent) +</dd> +</dl><a NAME="PipSearchDialog.on_buttonBox_clicked" ID="PipSearchDialog.on_buttonBox_clicked"></a> +<h4>PipSearchDialog.on_buttonBox_clicked</h4> +<b>on_buttonBox_clicked</b>(<i>button</i>) +<p> + Private slot called by a button of the button box clicked. +</p><dl> +<dt><i>button</i></dt> +<dd> +button that was clicked (QAbstractButton) +</dd> +</dl><a NAME="PipSearchDialog.on_resultList_itemActivated" ID="PipSearchDialog.on_resultList_itemActivated"></a> +<h4>PipSearchDialog.on_resultList_itemActivated</h4> +<b>on_resultList_itemActivated</b>(<i>item, column</i>) +<p> + Private slot reacting on an item activation. +</p><dl> +<dt><i>item</i></dt> +<dd> +reference to the activated item (QTreeWidgetItem) +</dd><dt><i>column</i></dt> +<dd> +activated column (integer) +</dd> +</dl><a NAME="PipSearchDialog.on_resultList_itemSelectionChanged" ID="PipSearchDialog.on_resultList_itemSelectionChanged"></a> +<h4>PipSearchDialog.on_resultList_itemSelectionChanged</h4> +<b>on_resultList_itemSelectionChanged</b>(<i></i>) +<p> + Private slot handling changes of the selection. +</p><a NAME="PipSearchDialog.on_searchButton_clicked" ID="PipSearchDialog.on_searchButton_clicked"></a> +<h4>PipSearchDialog.on_searchButton_clicked</h4> +<b>on_searchButton_clicked</b>(<i></i>) +<p> + Private slot handling a press of the search button. +</p><a NAME="PipSearchDialog.on_searchEdit_textChanged" ID="PipSearchDialog.on_searchEdit_textChanged"></a> +<h4>PipSearchDialog.on_searchEdit_textChanged</h4> +<b>on_searchEdit_textChanged</b>(<i>txt</i>) +<p> + Private slot handling a change of the search term. +</p><dl> +<dt><i>txt</i></dt> +<dd> +search term (string) +</dd> +</dl> +<div align="right"><a href="#top">Up</a></div> +<hr /> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage</h1> +<p> +Package implementing the configuration page. +</p> + + +<h3>Modules</h3> +<table> +<tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage.html">PipPage</a></td> +<td>Package implementing the configuration page.</td> +</tr> +</table> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.PipInterface.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins.PipInterface</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body> +<h1>eric6.Plugins.UiExtensionPlugins.PipInterface</h1> +<p> +Package implementing the various pip dialogs and data. +</p> + +<h3>Packages</h3> +<table> +<tr> +<td><a href="index-eric6.Plugins.UiExtensionPlugins.PipInterface.ConfigurationPage.html">ConfigurationPage</a></td> +<td>Package implementing the configuration page.</td> +</tr> +</table> + +<h3>Modules</h3> +<table> +<tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.Pip.html">Pip</a></td> +<td>Package implementing the pip GUI logic.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipDialog.html">PipDialog</a></td> +<td>Module implementing a dialog showing the output of a pip command.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipFreezeDialog.html">PipFreezeDialog</a></td> +<td>Module implementing a dialog to generate a requirements file.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipListDialog.html">PipListDialog</a></td> +<td>Module implementing a dialog to list installed packages.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackageDetailsDialog.html">PipPackageDetailsDialog</a></td> +<td>Module implementing a dialog to show details about a package.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipPackagesInputDialog.html">PipPackagesInputDialog</a></td> +<td>Module implementing a dialog to enter package specifications.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipRequirementsSelectionDialog.html">PipRequirementsSelectionDialog</a></td> +<td>Module implementing a dialog to enter a requirements file.</td> +</tr><tr> +<td><a href="eric6.Plugins.UiExtensionPlugins.PipInterface.PipSearchDialog.html">PipSearchDialog</a></td> +<td>Module implementing a dialog to search PyPI.</td> +</tr> +</table> +</body></html> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Documentation/Source/index-eric6.Plugins.UiExtensionPlugins.html Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html><head> +<title>eric6.Plugins.UiExtensionPlugins</title> +<meta charset="UTF-8"> +<style> +body { + background: #EDECE6; + margin: 0em 1em 10em 1em; + color: black; +} + +h1 { color: white; background: #85774A; } +h2 { color: white; background: #85774A; } +h3 { color: white; background: #9D936E; } +h4 { color: white; background: #9D936E; } + +a { color: #BA6D36; } + +</style> +</head> +<body> +<h1>eric6.Plugins.UiExtensionPlugins</h1> +<p> +Package containing the various interface extension plug-ins. +</p> + +<h3>Packages</h3> +<table> +<tr> +<td><a href="index-eric6.Plugins.UiExtensionPlugins.PipInterface.html">PipInterface</a></td> +<td>Package implementing the various pip dialogs and data.</td> +</tr> +</table> + +</body></html> \ No newline at end of file
--- a/Documentation/Source/index-eric6.Plugins.html Sat Dec 09 17:43:24 2017 +0100 +++ b/Documentation/Source/index-eric6.Plugins.html Sat Dec 09 18:32:08 2017 +0100 @@ -36,6 +36,9 @@ <td><a href="index-eric6.Plugins.DocumentationPlugins.html">DocumentationPlugins</a></td> <td>Package containing the various core documentation tool plugins.</td> </tr><tr> +<td><a href="index-eric6.Plugins.UiExtensionPlugins.html">UiExtensionPlugins</a></td> +<td>Package containing the various interface extension plug-ins.</td> +</tr><tr> <td><a href="index-eric6.Plugins.VcsPlugins.html">VcsPlugins</a></td> <td>Package containing the various version control system plugins.</td> </tr><tr> @@ -62,6 +65,9 @@ <td><a href="eric6.Plugins.PluginEricdoc.html">PluginEricdoc</a></td> <td>Module implementing the Ericdoc plugin.</td> </tr><tr> +<td><a href="eric6.Plugins.PluginPipInterface.html">PluginPipInterface</a></td> +<td>Module implementing the pip interface plug-in.</td> +</tr><tr> <td><a href="eric6.Plugins.PluginSyntaxChecker.html">PluginSyntaxChecker</a></td> <td>Module implementing the Syntax Checker plugin.</td> </tr><tr>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/PluginPipInterface.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,389 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the pip interface plug-in. +""" + +from __future__ import unicode_literals + +import os +import platform + +from PyQt5.QtCore import pyqtSignal, QObject, QCoreApplication + +from E5Gui.E5Application import e5App + +import Preferences +import Utilities +import UI.Info + +# Start-Of-Header +name = "pip Interface Plug-in" +author = "Detlev Offenbach <detlev@die-offenbachs.de>" +autoactivate = True +deactivateable = True +version = UI.Info.VersionOnly +className = "PipInterfacePlugin" +packageName = "__core__" +shortDescription = "Plug-in implementing a simple GUI for the pip command." +longDescription = ( + """Plug-in implementing a simple GUI for the pip command.""" +) +needsRestart = False +pyqtApi = 2 +python2Compatible = True +# End-Of-Header + +error = "" + +pipPluginObject = None + + +def exeDisplayDataList(): + """ + Module function to support the display of some executable info. + + @return list of dictionaries containing the data to query the presence of + the executable + """ + global pipPluginObject + + dataList = [] + data = { + "programEntry": True, + "header": QCoreApplication.translate( + "PipInterfacePlugin", "Package Management - pip"), + "exe": "dummyExe", + "versionCommand": "--version", + "versionStartsWith": "dummyExe", + "versionPosition": 1, + "version": "", + "versionCleanup": None, + } + if pipPluginObject is not None: + executables = pipPluginObject.getPreferences("PipExecutables") + if not executables: + executables = ["pip3", "pip2", "pip"] + for exePath in executables: + data["exe"] = exePath + data["versionStartsWith"] = "pip" + dataList.append(data.copy()) + return dataList + + +def createPipPage(configDlg): + """ + Module function to create the pip configuration page. + + @param configDlg reference to the configuration dialog + @return reference to the configuration page + """ + global pipPluginObject + from UiExtensionPlugins.PipInterface.ConfigurationPage.PipPage import \ + PipPage + page = PipPage(pipPluginObject) + return page + + +def getConfigData(): + """ + Module function returning data as required by the configuration dialog. + + @return dictionary containing the relevant data + """ + return { + "pipPage": [ + QCoreApplication.translate( + "PipInterfacePlugin", "Python Package Management"), + "preferences-python.png", + createPipPage, None, None + ], + } + + +def prepareUninstall(): + """ + Module function to prepare for an un-installation. + """ + Preferences.Prefs.settings.remove(PipInterfacePlugin.PreferencesKey) + + +def _findDefaultExecutables(majorVersion): + """ + Restricted function to determine the name and path of the executables. + + @param majorVersion major python version of the executables (int) + @return path names of the executables (list of string) + """ + # Determine Python Version + if majorVersion == 3: + minorVersions = range(10) + elif majorVersion == 2: + minorVersions = range(6, 8) + else: + return [] + + executables = set() + if Utilities.isWindowsPlatform(): + # + # Windows + # + try: + import winreg + except ImportError: + import _winreg as winreg # __IGNORE_WARNING__ + + def getExePath(branch, access, versionStr): + exes = [] + try: + software = winreg.OpenKey(branch, 'Software', 0, access) + python = winreg.OpenKey(software, 'Python', 0, access) + pcore = winreg.OpenKey(python, 'PythonCore', 0, access) + version = winreg.OpenKey(pcore, versionStr, 0, access) + installpath = winreg.QueryValue(version, 'InstallPath') + exe = os.path.join(installpath, 'Scripts', 'pip.exe') + if os.access(exe, os.X_OK): + exes.append(exe) + except (WindowsError, OSError): # __IGNORE_WARNING__ + pass + return exes + + for minorVersion in minorVersions: + versionStr = '{0}.{1}'.format(majorVersion, minorVersion) + exePaths = getExePath( + winreg.HKEY_CURRENT_USER, + winreg.KEY_WOW64_32KEY | winreg.KEY_READ, versionStr) + if exePaths: + for exePath in exePaths: + executables.add(exePath) + + exePaths = getExePath( + winreg.HKEY_LOCAL_MACHINE, + winreg.KEY_WOW64_32KEY | winreg.KEY_READ, versionStr) + if exePaths: + for exePath in exePaths: + executables.add(exePath) + + # Even on Intel 64-bit machines it's 'AMD64' + if platform.machine() == 'AMD64': + exePaths = getExePath( + winreg.HKEY_CURRENT_USER, + winreg.KEY_WOW64_64KEY | winreg.KEY_READ, versionStr) + if exePaths: + for exePath in exePaths: + executables.add(exePath) + + exePath = getExePath( + winreg.HKEY_LOCAL_MACHINE, + winreg.KEY_WOW64_64KEY | winreg.KEY_READ, versionStr) + if exePaths: + for exePath in exePaths: + executables.add(exePath) + else: + # + # Linux, Unix ... + pipScript = 'pip' + scriptSuffixes = ["", + "{0}".format(majorVersion), + "-{0}".format(majorVersion), + ] + for minorVersion in minorVersions: + scriptSuffixes.append( + "{0}.{1}".format(majorVersion, minorVersion)) + scriptSuffixes.append( + "-{0}.{1}".format(majorVersion, minorVersion)) + # There could be multiple pip executables in the path + # e.g. for different python variants + path = Utilities.getEnvironmentEntry('PATH') + # environment variable not defined + if path is None: + return [] + + # step 1: determine possible candidates + exes = [] + dirs = path.split(os.pathsep) + for directory in dirs: + for suffix in scriptSuffixes: + exe = os.path.join(directory, pipScript + suffix) + if os.access(exe, os.X_OK): + exes.append(exe) + + # step 2: determine the Python variant + if Utilities.isMacPlatform(): + checkStrings = ["Python.framework/Versions/3".lower(), + "python3"] + else: + checkStrings = ["python3"] + + _exePy2 = set() + _exePy3 = set() + for exe in exes: + try: + f = open(exe, "r") + line0 = f.readline() + for checkStr in checkStrings: + if checkStr in line0.lower(): + _exePy3.add(exe) + break + else: + _exePy2.add(exe) + finally: + f.close() + + executables = _exePy3 if majorVersion == 3 else _exePy2 + + return list(executables) + + +class PipInterfacePlugin(QObject): + """ + Class implementing the pip interface plug-in. + + @signal currentPipChanged(exe) emitted to signal a change of the current + pip executable + """ + PreferencesKey = "PipPlugin" + + currentPipChanged = pyqtSignal(str) + + def __init__(self, ui): + """ + Constructor + + @param ui reference to the user interface object (UI.UserInterface) + """ + super(PipInterfacePlugin, self).__init__(ui) + self.__ui = ui + self.__initialize() + + self.__defaults = { + "PipExecutables": [], + "CurrentPipExecutable": "", + "PipSearchIndex": "", # used by the search command + } + + def __initialize(self): + """ + Private slot to (re)initialize the plugin. + """ + self.__object = None + + self.__mainAct = None + self.__mainMenu = None + + def activate(self): + """ + Public method to activate this plugin. + + @return tuple of None and activation status (boolean) + """ + global error + error = "" # clear previous error + + global pipPluginObject + pipPluginObject = self + + from UiExtensionPlugins.PipInterface.Pip import Pip + self.__object = Pip(self, self.__ui) + self.__object.initActions() + e5App().registerPluginObject("PipGui", self.__object) + + menu = self.__ui.getMenu("extras") + self.__mainMenu = self.__object.initMenu() + self.__mainAct = menu.addMenu(self.__mainMenu) + + if self.getPreferences("PipExecutables"): + # remove all executables, that don't exist anymore + executables = [] + for executable in self.getPreferences("PipExecutables"): + if os.access(executable, os.X_OK): + executables.append(executable) + self.setPreferences("PipExecutables", executables) + + current = self.getPreferences("CurrentPipExecutable") + if current not in executables: + current = "" + self.setPreferences("CurrentPipExecutable", current) + else: + # load the list with default executables + self.setPreferences("PipExecutables", + self.getDefaultPipExecutables()) + + return None, True + + def deactivate(self): + """ + Public method to deactivate this plugin. + """ + e5App().unregisterPluginObject("PipGui") + + menu = self.__ui.getMenu("extras") + menu.removeAction(self.__mainAct) + self.__mainAct = None + + self.__initialize() + + def getPreferences(self, key): + """ + Public method to retrieve the various refactoring settings. + + @param key the key of the value to get + @return the requested refactoring setting + """ + if key in ["PipExecutables"]: + return Preferences.toList(Preferences.Prefs.settings.value( + self.PreferencesKey + "/" + key, self.__defaults[key])) + else: + return Preferences.Prefs.settings.value( + self.PreferencesKey + "/" + key, self.__defaults[key]) + + def setPreferences(self, key, value): + """ + Public method to store the various refactoring settings. + + @param key the key of the setting to be set (string) + @param value the value to be set + """ + Preferences.Prefs.settings.setValue( + self.PreferencesKey + "/" + key, value) + + if key == "CurrentPipExecutable": + self.currentPipChanged.emit(value) + + def getMenu(self, name): + """ + Public method to get a reference to the requested menu. + + @param name name of the menu (string) + @return reference to the menu (QMenu) or None, if no + menu with the given name exists + """ + if self.__object is not None: + return self.__object.getMenu(name) + else: + return None + + def getMenuNames(self): + """ + Public method to get the names of all menus. + + @return menu names (list of string) + """ + if self.__object is not None: + return list(self.__menus.keys()) + else: + return [] + + def getDefaultPipExecutables(self): + """ + Public method to get the default list of pip executables. + + @return list of pip executables (list of string) + """ + return _findDefaultExecutables(2) + _findDefaultExecutables(3) + +# +# eflag: noqa = M801
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the configuration page. +""" + +from __future__ import unicode_literals + +import os + +from PyQt5.QtCore import pyqtSlot, Qt, QSortFilterProxyModel, QStringListModel + +from E5Gui import E5FileDialog + +from Preferences.ConfigurationPages.ConfigurationPageBase import \ + ConfigurationPageBase +from .Ui_PipPage import Ui_PipPage + +from .. import DefaultIndexUrl + +import Utilities + + +class PipPage(ConfigurationPageBase, Ui_PipPage): + """ + Class implementing the configuration page. + """ + def __init__(self, plugin): + """ + Constructor + + @param plugin reference to the plugin object + """ + super(PipPage, self).__init__() + self.setupUi(self) + self.setObjectName("PipPage") + + self.__plugin = plugin + + self.__model = QStringListModel(self) + self.__proxyModel = QSortFilterProxyModel(self) + self.__proxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive) + self.__proxyModel.setSourceModel(self.__model) + self.stringList.setModel(self.__proxyModel) + + self.removeButton.clicked.connect(self.stringList.removeSelected) + self.removeAllButton.clicked.connect(self.stringList.removeAll) + + self.indexLabel.setText(self.tr( + '<b>Note:</b> Leave empty to use the default index URL (' + '<a href="{0}">{0}</a>).') + .format(DefaultIndexUrl)) + + # set initial values + self.__model.setStringList( + self.__plugin.getPreferences("PipExecutables")) + self.__model.sort(0) + self.indexEdit.setText(self.__plugin.getPreferences("PipSearchIndex")) + + @pyqtSlot() + def on_addButton_clicked(self): + """ + Private slot used to add an executable to the list. + """ + executable = E5FileDialog.getOpenFileName( + self, + self.tr("Add pip executable"), + os.path.expanduser("~"), + "") + executable = Utilities.toNativeSeparators(executable) + if executable != "" and executable not in self.__model.stringList(): + self.__model.insertRow(self.__model.rowCount()) + self.__model.setData( + self.__model.index(self.__model.rowCount() - 1), executable) + self.__model.sort(0) + + @pyqtSlot() + def on_defaultListButton_clicked(self): + """ + Private slot to load the default list of pip executables. + """ + self.stringList.removeAll() + defaults = self.__plugin.getDefaultPipExecutables() + for executable in defaults: + self.__model.insertRow(self.__model.rowCount()) + self.__model.setData( + self.__model.index(self.__model.rowCount() - 1), executable) + self.__model.sort(0) + + def save(self): + """ + Public slot to save the pip configuration. + """ + executables = self.__model.stringList()[:] + self.__plugin.setPreferences( + "PipExecutables", executables) + self.__plugin.setPreferences( + "PipSearchIndex", self.indexEdit.text().strip()) + if executables: + if self.__plugin.getPreferences("CurrentPipExecutable") \ + not in executables: + self.__plugin.setPreferences( + "CurrentPipExecutable", "") + else: + # reset the current executable if none have been configured + self.__plugin.setPreferences( + "CurrentPipExecutable", "")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipPage</class> + <widget class="QWidget" name="PipPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>602</width> + <height>389</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QLabel" name="headerLabel"> + <property name="text"> + <string><b>Configure pip</b></string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line9_3"> + <property name="frameShape"> + <enum>QFrame::HLine</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Index URL</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLineEdit" name="indexEdit"> + <property name="toolTip"> + <string>Enter the URL of the package index or leave empty to use the default</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="indexLabel"> + <property name="text"> + <string/> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>pip Executables</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" rowspan="7"> + <widget class="E5ListView" name="stringList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QPushButton" name="addButton"> + <property name="toolTip"> + <string>Press to add an entry</string> + </property> + <property name="text"> + <string>&Add...</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="Line" name="line_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QPushButton" name="removeButton"> + <property name="toolTip"> + <string>Press to remove the selected entries</string> + </property> + <property name="text"> + <string>&Remove</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QPushButton" name="removeAllButton"> + <property name="toolTip"> + <string>Press to remove all entries</string> + </property> + <property name="text"> + <string>R&emove All</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="Line" name="line_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QPushButton" name="defaultListButton"> + <property name="toolTip"> + <string>Press to load the default list</string> + </property> + <property name="text"> + <string>&Default</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>196</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>E5ListView</class> + <extends>QListView</extends> + <header>E5Gui/E5ListView.h</header> + </customwidget> + </customwidgets> + <tabstops> + <tabstop>indexEdit</tabstop> + <tabstop>stringList</tabstop> + <tabstop>addButton</tabstop> + <tabstop>removeButton</tabstop> + <tabstop>removeAllButton</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/__init__.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the configuration page. +"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/Pip.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,1008 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the pip GUI logic. +""" + +from __future__ import unicode_literals +try: + str = unicode # __IGNORE_EXCEPTION__ +except NameError: + pass + +import os +import re +import sys + +from PyQt5.QtCore import pyqtSlot, QObject, QProcess, QDir +from PyQt5.QtWidgets import QMenu, QInputDialog, QDialog + +from E5Gui import E5MessageBox, E5FileDialog +from E5Gui.E5Action import E5Action +from E5Gui.E5Application import e5App + +from .PipDialog import PipDialog + +import Preferences +import Globals + + +class Pip(QObject): + """ + Class implementing the pip GUI logic. + """ + def __init__(self, plugin, parent=None): + """ + Constructor + + @param plugin reference to the plugin object + @param parent parent (QObject) + """ + super(Pip, self).__init__(parent) + + self.__plugin = plugin + self.__ui = parent + + self.__menus = {} # dictionary with references to menus + + self.__plugin.currentPipChanged.connect(self.__handleTearOffMenu) + + def initActions(self): + """ + Public method to define the Django actions. + """ + self.actions = [] + + self.selectExecutableAct = E5Action( + self.tr('pip Executable'), + self.tr('pip &Executable'), + 0, 0, + self, 'pip_select_executable') + self.selectExecutableAct.setStatusTip(self.tr( + 'Selects the pip executable to be used')) + self.selectExecutableAct.setWhatsThis(self.tr( + """<b>pip Executable</b>""" + """<p>This selects the pip executable to be used. Multiple""" + """ executables can be pre-configured via the configuration""" + """ dialog.</p>""" + )) + self.selectExecutableAct.triggered.connect(self.__selectPipExecutable) + self.actions.append(self.selectExecutableAct) + + ############################################## + ## Actions for listing packages + ############################################## + + self.listPackagesAct = E5Action( + self.tr('List Installed Packages'), + self.tr('&List Installed Packages...'), + 0, 0, + self, 'pip_list_packages') + self.listPackagesAct.setStatusTip(self.tr( + 'List all installed packages with versions')) + self.listPackagesAct.setWhatsThis(self.tr( + """<b>List Installed Packages</b>""" + """<p>This lists all the installed packages together""" + """ with their versions.</p>""" + )) + self.listPackagesAct.triggered.connect(self.__listPackages) + self.actions.append(self.listPackagesAct) + + self.listUptodatePackagesAct = E5Action( + self.tr('List Up-to-date Packages'), + self.tr('List Up-to-&date Packages...'), + 0, 0, + self, 'pip_list_uptodate_packages') + self.listUptodatePackagesAct.setStatusTip(self.tr( + 'List all installed, up-to-date packages with versions')) + self.listUptodatePackagesAct.setWhatsThis(self.tr( + """<b>List Up-to-date Packages</b>""" + """<p>This lists all the installed, up-to-date packages together""" + """ with their versions.</p>""" + )) + self.listUptodatePackagesAct.triggered.connect( + self.__listUptodatePackages) + self.actions.append(self.listUptodatePackagesAct) + + self.listOutdatedPackagesAct = E5Action( + self.tr('List Outdated Packages'), + self.tr('List &Outdated Packages...'), + 0, 0, + self, 'pip_list_outdated_packages') + self.listOutdatedPackagesAct.setStatusTip(self.tr( + 'List all installed, outdated packages with versions')) + self.listOutdatedPackagesAct.setWhatsThis(self.tr( + """<b>List Up-to-date Packages</b>""" + """<p>This lists all the installed, outdated packages together""" + """ with their current and latest versions.</p>""" + )) + self.listOutdatedPackagesAct.triggered.connect( + self.__listOutdatedPackages) + self.actions.append(self.listOutdatedPackagesAct) + + ############################################## + ## Actions for installing packages + ############################################## + + self.installPackagesAct = E5Action( + self.tr('Install Packages'), + self.tr('&Install Packages'), + 0, 0, + self, 'pip_install_packages') + self.installPackagesAct.setStatusTip(self.tr( + 'Install packages according to user input')) + self.installPackagesAct.setWhatsThis(self.tr( + """<b>Install Packages</b>""" + """<p>This installs packages according to user input.</p>""" + )) + self.installPackagesAct.triggered.connect(self.__installPackages) + self.actions.append(self.installPackagesAct) + + self.installRequirementsAct = E5Action( + self.tr('Install Requirements'), + self.tr('Install Requirements'), + 0, 0, + self, 'pip_install_requirements') + self.installRequirementsAct.setStatusTip(self.tr( + 'Install packages according to a requirements file')) + self.installRequirementsAct.setWhatsThis(self.tr( + """<b>Install Requirements</b>""" + """<p>This installs packages according to a requirements""" + """ file.</p>""" + )) + self.installRequirementsAct.triggered.connect( + self.__installRequirements) + self.actions.append(self.installRequirementsAct) + + self.installPipAct = E5Action( + self.tr('Install Pip'), + self.tr('Install Pip'), + 0, 0, + self, 'pip_install_pip') + self.installPipAct.setStatusTip(self.tr( + 'Install the pip package itself')) + self.installPipAct.setWhatsThis(self.tr( + """<b>Install Pip</b>""" + """<p>This install the pip package itself.</p>""" + )) + self.installPipAct.triggered.connect(self.__installPip) + self.actions.append(self.installPipAct) + + self.repairPipAct = E5Action( + self.tr('Repair Pip'), + self.tr('Repair Pip'), + 0, 0, + self, 'pip_repair_pip') + self.repairPipAct.setStatusTip(self.tr( + 'Repair the pip package')) + self.repairPipAct.setWhatsThis(self.tr( + """<b>Repair Pip</b>""" + """<p>This repairs the pip package by re-installing it.</p>""" + )) + self.repairPipAct.triggered.connect(self.__repairPip) + self.actions.append(self.repairPipAct) + + self.upgradePipAct = E5Action( + self.tr('Upgrade Pip'), + self.tr('Upgrade &Pip'), + 0, 0, + self, 'pip_upgrade_pip') + self.upgradePipAct.setStatusTip(self.tr( + 'Upgrade the pip package itself')) + self.upgradePipAct.setWhatsThis(self.tr( + """<b>Upgrade Pip</b>""" + """<p>This upgrades the pip package itself.</p>""" + )) + self.upgradePipAct.triggered.connect(self.upgradePip) + self.actions.append(self.upgradePipAct) + + self.upgradePackagesAct = E5Action( + self.tr('Upgrade Packages'), + self.tr('&Upgrade Packages'), + 0, 0, + self, 'pip_upgrade_packages') + self.upgradePackagesAct.setStatusTip(self.tr( + 'Upgrade packages according to user input')) + self.upgradePackagesAct.setWhatsThis(self.tr( + """<b>Upgrade Packages</b>""" + """<p>This upgrades packages according to user input.</p>""" + )) + self.upgradePackagesAct.triggered.connect(self.__upgradePackages) + self.actions.append(self.upgradePackagesAct) + + ############################################## + ## Actions for uninstalling packages + ############################################## + + self.uninstallPackagesAct = E5Action( + self.tr('Uninstall Packages'), + self.tr('Uninstall Packages'), + 0, 0, + self, 'pip_uninstall_packages') + self.uninstallPackagesAct.setStatusTip(self.tr( + 'Uninstall packages according to user input')) + self.uninstallPackagesAct.setWhatsThis(self.tr( + """<b>Uninstall Packages</b>""" + """<p>This uninstalls packages according to user input.</p>""" + )) + self.uninstallPackagesAct.triggered.connect(self.__uninstallPackages) + self.actions.append(self.uninstallPackagesAct) + + self.uninstallRequirementsAct = E5Action( + self.tr('Uninstall Requirements'), + self.tr('Uninstall Requirements'), + 0, 0, + self, 'pip_uninstall_requirements') + self.uninstallRequirementsAct.setStatusTip(self.tr( + 'Uninstall packages according to a requirements file')) + self.uninstallRequirementsAct.setWhatsThis(self.tr( + """<b>Uninstall Requirements</b>""" + """<p>This uninstalls packages according to a requirements""" + """ file.</p>""" + )) + self.uninstallRequirementsAct.triggered.connect( + self.__uninstallRequirements) + self.actions.append(self.uninstallRequirementsAct) + + ############################################## + ## Actions for generating requirements files + ############################################## + + self.generateRequirementsAct = E5Action( + self.tr('Generate Requirements'), + self.tr('&Generate Requirements...'), + 0, 0, + self, 'pip_generate_requirements') + self.generateRequirementsAct.setStatusTip(self.tr( + 'Generate the contents of a requirements file')) + self.generateRequirementsAct.setWhatsThis(self.tr( + """<b>Generate Requirements</b>""" + """<p>This generates the contents of a requirements file.</p>""" + )) + self.generateRequirementsAct.triggered.connect( + self.__generateRequirements) + self.actions.append(self.generateRequirementsAct) + + ############################################## + ## Actions for generating requirements files + ############################################## + + self.searchPyPIAct = E5Action( + self.tr('Search PyPI'), + self.tr('&Search PyPI...'), + 0, 0, + self, 'pip_search_pypi') + self.searchPyPIAct.setStatusTip(self.tr( + 'Open a dialog to search the Python Package Index')) + self.searchPyPIAct.setWhatsThis(self.tr( + """<b>Search PyPI</b>""" + """<p>This opens a dialog to search the Python Package""" + """ Index.</p>""" + )) + self.searchPyPIAct.triggered.connect(self.__searchPyPI) + self.actions.append(self.searchPyPIAct) + + ############################################## + ## Actions for editing configuration files + ############################################## + + self.editUserConfigAct = E5Action( + self.tr('Edit User Configuration'), + self.tr('Edit User Configuration...'), + 0, 0, + self, 'pip_edit_user_config') + self.editUserConfigAct.setStatusTip(self.tr( + 'Open the per user configuration file in an editor')) + self.editUserConfigAct.setWhatsThis(self.tr( + """<b>Edit User Configuration</b>""" + """<p>This opens the per user configuration file in an editor.""" + """</p>""" + )) + self.editUserConfigAct.triggered.connect(self.__editUserConfiguration) + self.actions.append(self.editUserConfigAct) + + self.editVirtualenvConfigAct = E5Action( + self.tr('Edit Current Virtualenv Configuration'), + self.tr('Edit Current Virtualenv Configuration...'), + 0, 0, + self, 'pip_edit_virtualenv_config') + self.editVirtualenvConfigAct.setStatusTip(self.tr( + 'Open the current virtualenv configuration file in an editor')) + self.editVirtualenvConfigAct.setWhatsThis(self.tr( + """<b>Edit Current Virtualenv Configuration</b>""" + """<p>This opens the current virtualenv configuration file in""" + """ an editor. </p>""" + )) + self.editVirtualenvConfigAct.triggered.connect( + self.__editVirtualenvConfiguration) + self.actions.append(self.editVirtualenvConfigAct) + + self.pipConfigAct = E5Action( + self.tr('Configure'), + self.tr('Configure...'), + 0, 0, self, 'pip_configure') + self.pipConfigAct.setStatusTip(self.tr( + 'Show the configuration dialog with the Python Package Management' + ' page selected' + )) + self.pipConfigAct.setWhatsThis(self.tr( + """<b>Configure</b>""" + """<p>Show the configuration dialog with the Python Package""" + """ Management page selected.</p>""" + )) + self.pipConfigAct.triggered.connect(self.__pipConfigure) + self.actions.append(self.pipConfigAct) + + def initMenu(self): + """ + Public slot to initialize the Django menu. + + @return the menu generated (QMenu) + """ + self.__menus = {} # clear menus references + + menu = QMenu(self.tr('P&ython Package Management'), self.__ui) + menu.setTearOffEnabled(True) + + menu.addAction(self.selectExecutableAct) + menu.addSeparator() + menu.addAction(self.listPackagesAct) + menu.addAction(self.listUptodatePackagesAct) + menu.addAction(self.listOutdatedPackagesAct) + menu.addSeparator() + menu.addAction(self.installPipAct) + menu.addAction(self.installPackagesAct) + menu.addAction(self.installRequirementsAct) + menu.addSeparator() + menu.addAction(self.upgradePipAct) + menu.addAction(self.upgradePackagesAct) + menu.addSeparator() + menu.addAction(self.uninstallPackagesAct) + menu.addAction(self.uninstallRequirementsAct) + menu.addSeparator() + menu.addAction(self.generateRequirementsAct) + menu.addSeparator() + menu.addAction(self.searchPyPIAct) + menu.addSeparator() + menu.addAction(self.repairPipAct) + menu.addSeparator() + menu.addAction(self.editUserConfigAct) + menu.addAction(self.editVirtualenvConfigAct) + menu.addSeparator() + menu.addAction(self.pipConfigAct) + + self.__menus["main"] = menu + + menu.aboutToShow.connect(self.__aboutToShowMenu) + + return menu + + def __aboutToShowMenu(self): + """ + Private slot to set the action enabled status. + """ + enable = bool(self.__plugin.getPreferences("CurrentPipExecutable")) + for act in self.actions: + if act not in [self.selectExecutableAct, + self.installPipAct, + self.editUserConfigAct, + self.editVirtualenvConfigAct, + self.pipConfigAct]: + act.setEnabled(enable) + + def getMenu(self, name): + """ + Public method to get a reference to the requested menu. + + @param name name of the menu (string) + @return reference to the menu (QMenu) or None, if no + menu with the given name exists + """ + if name in self.__menus: + return self.__menus[name] + else: + return None + + def getMenuNames(self): + """ + Public method to get the names of all menus. + + @return menu names (list of string) + """ + return list(self.__menus.keys()) + + def __handleTearOffMenu(self, pip): + """ + Private slot to handle a change of the pip executable. + + @param pip path of the pip executable + @type str + """ + if self.__menus["main"].isTearOffMenuVisible(): + # determine, if torn off menu needs to be refreshed + enabled = self.listPackagesAct.isEnabled() + if ((bool(pip) and not enabled) or + (not bool(pip) and enabled)): + self.__menus["main"].hideTearOffMenu() + + ########################################################################## + ## Methods below implement some utility functions + ########################################################################## + + def runProcess(self, args, cmd=""): + """ + Public method to execute the current pip with the given arguments. + + The selected pip executable is called with the given arguments and + waited for its end. + + @param args list of command line arguments (list of string) + @param cmd pip command to be used (string) + @return tuple containing a flag indicating success and the output + of the process (string) + """ + if not cmd: + cmd = self.__plugin.getPreferences("CurrentPipExecutable") + ioEncoding = Preferences.getSystem("IOEncoding") + + process = QProcess() + process.start(cmd, args) + procStarted = process.waitForStarted() + if procStarted: + finished = process.waitForFinished(30000) + if finished: + if process.exitCode() == 0: + output = str(process.readAllStandardOutput(), ioEncoding, + 'replace') + return True, output + else: + return False, self.tr("pip exited with an error ({0}).")\ + .format(process.exitCode()) + else: + process.terminate() + process.waitForFinished(2000) + process.kill() + process.waitForFinished(3000) + return False, self.tr("pip did not finish within 30 seconds.") + + return False, self.tr("pip could not be started.") + + def __getUserConfig(self): + """ + Private method to get the name of the user configuration file. + + @return path of the user configuration file (string) + """ + # Unix: ~/.config/pip/pip.conf + # OS X: ~/Library/Application Support/pip/pip.conf + # Windows: %APPDATA%\pip\pip.ini + # Environment: $PIP_CONFIG_FILE + + try: + return os.environ["PIP_CONFIG_FILE"] + except KeyError: + pass + + if Globals.isWindowsPlatform(): + config = os.path.join(os.environ["APPDATA"], "pip", "pip.ini") + elif Globals.isMacPlatform(): + config = os.path.expanduser( + "~/Library/Application Support/pip/pip.conf") + else: + config = os.path.expanduser("~/.config/pip/pip.conf") + + return config + + def __getVirtualenvConfig(self): + """ + Private method to get the name of the virtualenv configuration file. + + @return path of the virtualenv configuration file (string) + """ + # Unix, OS X: $VIRTUAL_ENV/pip.conf + # Windows: %VIRTUAL_ENV%\pip.ini + + if Globals.isWindowsPlatform(): + pip = "pip.ini" + else: + pip = "pip.conf" + try: + virtualenv = os.environ["VIRTUAL_ENV"] + except KeyError: + # determine from pip executable file + virtualenv = os.path.dirname(os.path.dirname( + self.__plugin.getPreferences("CurrentPipExecutable"))) + + return os.path.join(virtualenv, pip) + + ########################################################################## + ## Methods below implement the individual menu entries + ########################################################################## + + def __selectPipExecutable(self): + """ + Private method to select the pip executable to be used. + """ + pipExecutables = sorted(self.__plugin.getPreferences("PipExecutables")) + if pipExecutables: + currentExecutable = self.__plugin.getPreferences( + "CurrentPipExecutable") + try: + index = pipExecutables.index(currentExecutable) + except ValueError: + index = 0 + executable, ok = QInputDialog.getItem( + None, + self.tr("pip Executable"), + self.tr("Select pip Executable to be used:"), + pipExecutables, index, False) + + if ok and executable: + self.__plugin.setPreferences("CurrentPipExecutable", + executable) + else: + res = E5MessageBox.yesNo( + None, + self.tr("pip Executable"), + self.tr("""No pip executables have been configured yet.""" + """ Shall this be done now?"""), + yesDefault=True) + if res: + e5App().getObject("UserInterface").showPreferences("pipPage") + + def __listPackages(self): + """ + Private slot to list all installed packages. + """ + from .PipListDialog import PipListDialog + self.__listDialog = PipListDialog( + self, "list", self.__plugin, self.tr("Installed Packages")) + self.__listDialog.show() + self.__listDialog.start() + + def __listUptodatePackages(self): + """ + Private slot to list all installed, up-to-date packages. + """ + from .PipListDialog import PipListDialog + self.__listUptodateDialog = PipListDialog( + self, "uptodate", self.__plugin, self.tr("Up-to-date Packages")) + self.__listUptodateDialog.show() + self.__listUptodateDialog.start() + + def __listOutdatedPackages(self): + """ + Private slot to list all installed, up-to-date packages. + """ + from .PipListDialog import PipListDialog + self.__listOutdatedDialog = PipListDialog( + self, "outdated", self.__plugin, self.tr("Outdated Packages")) + self.__listOutdatedDialog.show() + self.__listOutdatedDialog.start() + + def __editUserConfiguration(self): + """ + Private slot to edit the user configuration. + """ + self.__editConfiguration() + + def __editVirtualenvConfiguration(self): + """ + Private slot to edit the current virtualenv configuration. + """ + self.__editConfiguration(virtualenv=True) + + def __editConfiguration(self, virtualenv=False): + """ + Private method to edit a configuration. + + @param virtualenv flag indicating to edit the current virtualenv + configuration file (boolean) + """ + from QScintilla.MiniEditor import MiniEditor + if virtualenv: + cfgFile = self.__getVirtualenvConfig() + else: + cfgFile = self.__getUserConfig() + cfgDir = os.path.dirname(cfgFile) + if not cfgDir: + E5MessageBox.critical( + None, + self.tr("Edit Configuration"), + self.tr("""No valid configuartion path determined.""" + """ Is a virtual environment selected? Aborting""")) + return + + try: + if not os.path.isdir(cfgDir): + os.makedirs(cfgDir) + except OSError: + E5MessageBox.critical( + None, + self.tr("Edit Configuration"), + self.tr("""No valid configuartion path determined.""" + """ Is a virtual environment selected? Aborting""")) + return + + if not os.path.exists(cfgFile): + try: + f = open(cfgFile, "w") + f.write("[global]\n") + f.close() + except (IOError, OSError): + # ignore these + pass + + # check, if the destination is writeable + if not os.access(cfgFile, os.W_OK): + E5MessageBox.critical( + None, + self.tr("Edit Configuration"), + self.tr("""No valid configuartion path determined.""" + """ Is a virtual environment selected? Aborting""")) + return + + self.__editor = MiniEditor(cfgFile, "Properties") + self.__editor.show() + + def __installPip(self): + """ + Private slot to install pip. + """ + python = E5FileDialog.getOpenFileName( + None, + self.tr("Select Python Executable")) + if python: + python = QDir.toNativeSeparators(python) + dia = PipDialog(self.tr('Install PIP')) + res = dia.startProcesses([ + (python, ["-m", "ensurepip"]), + (python, ["-m", "pip", "install", "--upgrade", "pip"]), + ]) + if res: + dia.exec_() + pip = E5FileDialog.getOpenFileName( + None, + self.tr("Select PIP Executable"), + os.path.dirname(python)) + if pip: + pip = QDir.toNativeSeparators(pip) + pipExecutables = \ + self.__plugin.getPreferences("PipExecutables") + if pip not in pipExecutables: + pipExecutables.append(pip) + self.__plugin.setPreferences( + "PipExecutables", pipExecutables) + + @pyqtSlot() + def upgradePip(self, pip=""): + """ + Public method to upgrade pip itself. + + @param pip pip command to be used + @type str + @return flag indicating a successful execution + @rtype bool + """ + # Upgrading pip needs to be treated specially because + # it must be done using the python executable + + if not pip: + default = self.tr("<Default>") + pipExecutables = sorted( + self.__plugin.getPreferences("PipExecutables")) + pip, ok = QInputDialog.getItem( + None, + self.tr("Upgrade pip"), + self.tr("Select pip Executable:"), + [default] + pipExecutables, + 0, False) + if not ok or not pip: + return False + + if pip == default: + pip = self.__plugin.getPreferences("CurrentPipExecutable") + + python = self.__getPython(pip) + if not python: + python = E5FileDialog.getOpenFileName( + None, + self.tr("Select Python Executable"), + os.path.dirname(pip)) + if python: + python = QDir.toNativeSeparators(python) + else: + return False + + args = ["-m", "pip", "install", "--upgrade", "pip"] + dia = PipDialog(self.tr('Upgrade PIP')) + res = dia.startProcess(python, args) + if res: + dia.exec_() + return res + + @pyqtSlot() + def __repairPip(self): + default = self.tr("<Default>") + pipExecutables = sorted( + self.__plugin.getPreferences("PipExecutables")) + pip, ok = QInputDialog.getItem( + None, + self.tr("Upgrade pip"), + self.tr("Select pip Executable:"), + [default] + pipExecutables, + 0, False) + if not ok or not pip: + return False + + if pip == default: + pip = self.__plugin.getPreferences("CurrentPipExecutable") + + python = self.__getPython(pip) + if not python: + python = E5FileDialog.getOpenFileName( + None, + self.tr("Select Python Executable"), + os.path.dirname(pip)) + if python: + python = QDir.toNativeSeparators(python) + else: + return False + + # pip install --ignore-installed pip + args = ["-m", "pip", "install", "--ignore-installed", "pip"] + dia = PipDialog(self.tr('Repair PIP')) + res = dia.startProcess(python, args) + if res: + dia.exec_() + + def __getPython(self, cmd): + """ + Private method to derive the path to the python executable given the + path to the pip executable. + + @param cmd path of the pip executable + @type str + @return path of the python executable + @rtype str + """ + path, prog = os.path.split(cmd) + paths = (path, os.path.split(path)[0]) # to try the parent directory + if Globals.isWindowsPlatform(): + subPatterns = ((r"\d\.\d", ""), + (r"\d\.", ".")) + for pyname in ("python", "pypy"): + python = prog.replace("pip", pyname) + for pattern, repl in subPatterns: + if re.search(pattern, python): + python = re.sub(pattern, repl, python) + break + for path in paths: + pypath = os.path.join(path, python) + if os.path.exists(pypath): + return pypath + else: + subPatterns = ((r"\.\d$", ""), + (r"\d\.\d$", ""), + (r"\d$", "")) + for pyname in ("python", "pypy"): + python = prog.replace("pip", pyname) + for path in paths: + pypath = os.path.join(path, python) + if os.path.exists(pypath): + return pypath + + for pattern, repl in subPatterns: + if re.search(pattern, cmd): + newpy = re.sub(pattern, repl, python) + pypath = os.path.join(path, newpy) + if os.path.exists(pypath): + return pypath + + return "" + + def __checkUpgradePyQt(self, packages): + """ + Private method to check, if an upgrade of PyQt packages is attempted. + + @param packages list of packages to upgrade + @type list of str + @return flag indicating to abort the upgrade attempt + @rtype bool + """ + pyqtPackages = [p for p in packages + if p.lower() in ["pyqt5", "qscintilla", "sip"]] + + if bool(pyqtPackages): + abort = not E5MessageBox.yesNo( + None, + self.tr("Upgrade Packages"), + self.tr( + """You are trying to upgrade PyQt packages. This will""" + """ not work for the current instance of Python ({0}).""" + """ Do you want to continue?""").format(sys.executable), + icon=E5MessageBox.Critical) + else: + abort = False + + return abort + + def upgradePackages(self, packages, cmd=""): + """ + Public method to upgrade the given list of packages. + + @param packages list of packages to upgrade (list of string) + @param cmd pip command to be used (string) + @return flag indicating a successful execution (boolean) + """ + if self.__checkUpgradePyQt(packages): + return False + + if not cmd: + cmd = self.__plugin.getPreferences("CurrentPipExecutable") + args = ["install", "--upgrade"] + packages + dia = PipDialog(self.tr('Upgrade Packages')) + res = dia.startProcess(cmd, args) + if res: + dia.exec_() + return res + + def __upgradePackages(self): + """ + Private slot to upgrade packages to be given by the user. + """ + from .PipPackagesInputDialog import PipPackagesInputDialog + dlg = PipPackagesInputDialog( + self.__plugin, self.tr("Upgrade Packages")) + if dlg.exec_() == QDialog.Accepted: + command, packages = dlg.getData() + if packages: + self.upgradePackages(packages, cmd=command) + + def installPackages(self, packages, cmd=""): + """ + Public method to install the given list of packages. + + @param packages list of packages to install (list of string) + @param cmd pip command to be used (string) + """ + if not cmd: + cmd = self.__plugin.getPreferences("CurrentPipExecutable") + args = ["install"] + packages + dia = PipDialog(self.tr('Install Packages')) + res = dia.startProcess(cmd, args) + if res: + dia.exec_() + + def __installPackages(self): + """ + Private slot to install packages to be given by the user. + """ + from .PipPackagesInputDialog import PipPackagesInputDialog + dlg = PipPackagesInputDialog( + self.__plugin, self.tr("Install Packages")) + if dlg.exec_() == QDialog.Accepted: + command, packages = dlg.getData() + if packages: + self.installPackages(packages, cmd=command) + + def __installRequirements(self): + """ + Private slot to install packages as given in a requirements file. + """ + from .PipRequirementsSelectionDialog import \ + PipRequirementsSelectionDialog + dlg = PipRequirementsSelectionDialog(self.__plugin) + if dlg.exec_() == QDialog.Accepted: + command, requirements = dlg.getData() + if requirements and os.path.exists(requirements): + if not command: + command = self.__plugin.getPreferences( + "CurrentPipExecutable") + args = ["install", "--requirement", requirements] + dia = PipDialog(self.tr('Install Packages from Requirements')) + res = dia.startProcess(command, args) + if res: + dia.exec_() + + def uninstallPackages(self, packages, cmd=""): + """ + Public method to uninstall the given list of packages. + + @param packages list of packages to uninstall (list of string) + @param cmd pip command to be used (string) + @return flag indicating a successful execution (boolean) + """ + res = False + if packages: + from UI.DeleteFilesConfirmationDialog import \ + DeleteFilesConfirmationDialog + dlg = DeleteFilesConfirmationDialog( + self.parent(), + self.tr("Uninstall Packages"), + self.tr( + "Do you really want to uninstall these packages?"), + packages) + if dlg.exec_() == QDialog.Accepted: + if not cmd: + cmd = self.__plugin.getPreferences("CurrentPipExecutable") + args = ["uninstall", "--yes"] + packages + dia = PipDialog(self.tr('Uninstall Packages')) + res = dia.startProcess(cmd, args) + if res: + dia.exec_() + return res + + def __uninstallPackages(self): + """ + Private slot to uninstall packages to be given by the user. + """ + from .PipPackagesInputDialog import PipPackagesInputDialog + dlg = PipPackagesInputDialog( + self.__plugin, self.tr("Uninstall Packages")) + if dlg.exec_() == QDialog.Accepted: + command, packages = dlg.getData() + if packages: + self.uninstallPackages(packages, cmd=command) + + def __uninstallRequirements(self): + """ + Private slot to uninstall packages as given in a requirements file. + """ + from .PipRequirementsSelectionDialog import \ + PipRequirementsSelectionDialog + dlg = PipRequirementsSelectionDialog(self.__plugin) + if dlg.exec_() == QDialog.Accepted: + command, requirements = dlg.getData() + if requirements and os.path.exists(requirements): + try: + f = open(requirements, "r") + reqs = f.read().splitlines() + f.close() + except (OSError, IOError): + return + + from UI.DeleteFilesConfirmationDialog import \ + DeleteFilesConfirmationDialog + dlg = DeleteFilesConfirmationDialog( + self.parent(), + self.tr("Uninstall Packages"), + self.tr( + "Do you really want to uninstall these packages?"), + reqs) + if dlg.exec_() == QDialog.Accepted: + if not command: + command = self.__plugin.getPreferences( + "CurrentPipExecutable") + args = ["uninstall", "--requirement", requirements] + dia = PipDialog( + self.tr('Uninstall Packages from Requirements')) + res = dia.startProcess(command, args) + if res: + dia.exec_() + + def __generateRequirements(self): + """ + Private slot to generate the contents for a requirements file. + """ + from .PipFreezeDialog import PipFreezeDialog + self.__freezeDialog = PipFreezeDialog(self, self.__plugin) + self.__freezeDialog.show() + self.__freezeDialog.start() + + def __searchPyPI(self): + """ + Private slot to search the Python Package Index. + """ + from .PipSearchDialog import PipSearchDialog + self.__searchDialog = PipSearchDialog(self, self.__plugin) + self.__searchDialog.show() + + def __pipConfigure(self): + """ + Private slot to open the configuration page. + """ + e5App().getObject("UserInterface").showPreferences("pipPage")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,194 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog showing the output of a pip command. +""" + +from __future__ import unicode_literals +try: + str = unicode # __IGNORE_EXCEPTION__ +except NameError: + pass + +from PyQt5.QtCore import pyqtSlot, Qt, QCoreApplication, QTimer, \ + QProcess +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton + +from E5Gui import E5MessageBox + +from .Ui_PipDialog import Ui_PipDialog + +import Preferences + + +class PipDialog(QDialog, Ui_PipDialog): + """ + Class implementing a dialog showing the output of a pip command. + """ + def __init__(self, text, parent=None): + """ + Constructor + + @param text text to be shown by the label (string) + @param parent reference to the parent widget (QWidget) + """ + super(PipDialog, self).__init__(parent) + self.setupUi(self) + + self.proc = None + self.__processQueue = [] + self.__ioEncoding = Preferences.getSystem("IOEncoding") + + self.outputGroup.setTitle(text) + + self.show() + QCoreApplication.processEvents() + + def closeEvent(self, e): + """ + Protected slot implementing a close event handler. + + @param e close event (QCloseEvent) + """ + self.__processQueue = [] + + if self.proc is not None and \ + self.proc.state() != QProcess.NotRunning: + self.proc.terminate() + QTimer.singleShot(2000, self.proc.kill) + self.proc.waitForFinished(3000) + + self.proc = None + + e.accept() + + def __finish(self): + """ + Private slot called when the process finished or the user pressed + the button. + """ + if self.proc is not None and \ + self.proc.state() != QProcess.NotRunning: + self.proc.terminate() + QTimer.singleShot(2000, self.proc.kill) + self.proc.waitForFinished(3000) + + self.proc = None + + self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.Close).setFocus( + Qt.OtherFocusReason) + + if self.__processQueue: + cmd, args = self.__processQueue.pop(0) + self.__addOutput("\n\n") + self.startProcess(cmd, args) + + @pyqtSlot(QAbstractButton) + def on_buttonBox_clicked(self, button): + """ + Private slot called by a button of the button box clicked. + + @param button button that was clicked (QAbstractButton) + """ + if button == self.buttonBox.button(QDialogButtonBox.Close): + self.close() + + def __procFinished(self, exitCode, exitStatus): + """ + Private slot connected to the finished signal. + + @param exitCode exit code of the process (integer) + @param exitStatus exit status of the process (QProcess.ExitStatus) + """ + self.__finish() + + def startProcess(self, cmd, args, showArgs=True): + """ + Public slot used to start the process. + + @param cmd name of the pip executable to be used (string) + @param args list of arguments for the process (list of strings) + @keyparam showArgs flag indicating to show the arguments (boolean) + @return flag indicating a successful start of the process + """ + if len(self.errors.toPlainText()) == 0: + self.errorGroup.hide() + + if showArgs: + self.resultbox.append(cmd + ' ' + ' '.join(args)) + self.resultbox.append('') + + self.proc = QProcess() + self.proc.finished.connect(self.__procFinished) + self.proc.readyReadStandardOutput.connect(self.__readStdout) + self.proc.readyReadStandardError.connect(self.__readStderr) + self.proc.start(cmd, args) + procStarted = self.proc.waitForStarted(5000) + if not procStarted: + self.buttonBox.setFocus() + E5MessageBox.critical( + self, + self.tr('Process Generation Error'), + self.tr( + 'The process {0} could not be started.' + ).format(cmd)) + return procStarted + + def startProcesses(self, processParams): + """ + Public method to issue a list of commands to be executed. + + @param processParams list of tuples containing the command + and arguments + @type list of tuples of str and list of str + @return flag indicating a successful start of the first process + @rtype bool + """ + if len(processParams) > 1: + for cmd, args in processParams[1:]: + self.__processQueue.append((cmd, args[:])) + cmd, args = processParams[0] + return self.startProcess(cmd, args) + + def __readStdout(self): + """ + Private slot to handle the readyReadStandardOutput signal. + + It reads the output of the process, formats it and inserts it into + the contents pane. + """ + if self.proc is not None: + txt = str(self.proc.readAllStandardOutput(), + self.__ioEncoding, 'replace') + self.__addOutput(txt) + + def __addOutput(self, txt): + """ + Private method to add some text to the output pane. + + @param txt text to be added + @type str + """ + self.resultbox.insertPlainText(txt) + self.resultbox.ensureCursorVisible() + QCoreApplication.processEvents() + + def __readStderr(self): + """ + Private slot to handle the readyReadStandardError signal. + + It reads the error output of the process and inserts it into the + error pane. + """ + if self.proc is not None: + s = str(self.proc.readAllStandardError(), + self.__ioEncoding, 'replace') + self.errorGroup.show() + self.errors.insertPlainText(s) + self.errors.ensureCursorVisible() + + QCoreApplication.processEvents()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipDialog</class> + <widget class="QDialog" name="PipDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>500</height> + </rect> + </property> + <property name="windowTitle"> + <string>pip</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QGroupBox" name="outputGroup"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>2</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Output</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QTextEdit" name="resultbox"> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="errorGroup"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Errors</string> + </property> + <layout class="QVBoxLayout"> + <item> + <widget class="QTextEdit" name="errors"> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <layoutdefault spacing="6" margin="11"/> + <pixmapfunction>qPixmapFromMimeSource</pixmapfunction> + <tabstops> + <tabstop>resultbox</tabstop> + <tabstop>errors</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,306 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to generate a requirements file. +""" + +from __future__ import unicode_literals +try: + str = unicode # __IGNORE_EXCEPTION__ +except NameError: + pass + +import os + +from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, \ + QApplication + +from E5Gui import E5MessageBox, E5FileDialog +from E5Gui.E5Application import e5App + +from .Ui_PipFreezeDialog import Ui_PipFreezeDialog + +import Utilities +import UI.PixmapCache + + +class PipFreezeDialog(QDialog, Ui_PipFreezeDialog): + """ + Class implementing a dialog to generate a requirements file. + """ + def __init__(self, pip, plugin, parent=None): + """ + Constructor + + @param pip reference to the master object (Pip) + @param plugin reference to the plugin object (ToolPipPlugin) + @param parent reference to the parent widget (QWidget) + """ + super(PipFreezeDialog, self).__init__(parent) + self.setupUi(self) + self.setWindowFlags(Qt.Window) + + self.__refreshButton = self.buttonBox.addButton( + self.tr("&Refresh"), QDialogButtonBox.ActionRole) + + self.fileButton.setIcon(UI.PixmapCache.getIcon("open.png")) + + self.__pip = pip + + self.__default = self.tr("<Default>") + pipExecutables = sorted(plugin.getPreferences("PipExecutables")) + self.pipComboBox.addItem(self.__default) + self.pipComboBox.addItems(pipExecutables) + + self.__requirementsEdited = False + self.__requirementsAvailable = False + + self.__updateButtons() + + def closeEvent(self, e): + """ + Protected slot implementing a close event handler. + + @param e close event (QCloseEvent) + """ + QApplication.restoreOverrideCursor() + e.accept() + + @pyqtSlot(str) + def on_pipComboBox_activated(self, txt): + """ + Private slot handling the selection of a pip executable. + + @param txt path of the pip executable (string) + """ + self.__refresh() + + @pyqtSlot(bool) + def on_localCheckBox_clicked(self, checked): + """ + Private slot handling the switching of the local mode. + + @param checked state of the local check box (boolean) + """ + self.__refresh() + + @pyqtSlot(str) + def on_requirementsFileEdit_textChanged(self, txt): + """ + Private slot handling a change of the requirements file name. + + @param txt name of the requirements file (string) + """ + self.__updateButtons() + + @pyqtSlot() + def on_fileButton_clicked(self): + """ + Private slot to enter the requirements file via a file selection + dialog. + """ + fileName = E5FileDialog.getOpenFileName( + self, + self.tr("Select the requirements file"), + self.requirementsFileEdit.text() or os.path.expanduser("~"), + self.tr("Text Files (*.txt);;All Files (*)") + ) + if fileName: + self.requirementsFileEdit.setText( + Utilities.toNativeSeparators(fileName)) + + @pyqtSlot() + def on_requirementsEdit_textChanged(self): + """ + Private slot handling changes of the requirements text. + """ + self.__requirementsEdited = True + + @pyqtSlot(QAbstractButton) + def on_buttonBox_clicked(self, button): + """ + Private slot called by a button of the button box clicked. + + @param button button that was clicked (QAbstractButton) + """ + if button == self.buttonBox.button(QDialogButtonBox.Close): + self.close() + elif button == self.__refreshButton: + self.__refresh() + + def __refresh(self): + """ + Private slot to refresh the displayed list. + """ + if self.__requirementsEdited: + ok = E5MessageBox.yesNo( + self, + self.tr("Generate Requirements"), + self.tr("""The requirements were changed. Do you want""" + """ to overwrite these changes?""")) + else: + ok = True + if ok: + self.start() + + def start(self): + """ + Public method to start the command. + """ + self.requirementsEdit.clear() + self.__requirementsAvailable = False + + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + + args = ["freeze"] + if self.localCheckBox.isChecked(): + args.append("--local") + if self.requirementsFileEdit.text(): + fileName = Utilities.toNativeSeparators( + self.requirementsFileEdit.text()) + if os.path.exists(fileName): + args.append("--requirement") + args.append(fileName) + + QApplication.setOverrideCursor(Qt.WaitCursor) + success, output = self.__pip.runProcess( + args, cmd=command) + + if success: + self.requirementsEdit.setPlainText(output) + self.__requirementsAvailable = True + else: + self.requirementsEdit.setPlainText( + self.tr("No output generated by 'pip freeze'.")) + + QApplication.restoreOverrideCursor() + self.__updateButtons() + + self.__requirementsEdited = False + + def __updateButtons(self): + """ + Private method to set the state of the various buttons. + """ + self.saveButton.setEnabled( + self.__requirementsAvailable and + bool(self.requirementsFileEdit.text()) + ) + self.saveToButton.setEnabled(self.__requirementsAvailable) + self.copyButton.setEnabled(self.__requirementsAvailable) + + aw = e5App().getObject("ViewManager").activeWindow() + if aw and self.__requirementsAvailable: + self.insertButton.setEnabled(True) + self.replaceAllButton.setEnabled(True) + self.replaceSelectionButton.setEnabled( + aw.hasSelectedText()) + else: + self.insertButton.setEnabled(False) + self.replaceAllButton.setEnabled(False) + self.replaceSelectionButton.setEnabled(False) + + def __writeToFile(self, fileName): + """ + Private method to write the requirements text to a file. + + @param fileName name of the file to write to (string) + """ + if os.path.exists(fileName): + ok = E5MessageBox.warning( + self, + self.tr("Generate Requirements"), + self.tr("""The file <b>{0}</b> already exists. Do you want""" + """ to overwrite it?""").format(fileName)) + if not ok: + return + + try: + f = open(fileName, "w") + f.write(self.requirementsEdit.toPlainText()) + f.close() + except (OSError, IOError) as err: + E5MessageBox.critical( + self, + self.tr("Generate Requirements"), + self.tr("""<p>The requirements could not be written""" + """ to <b>{0}</b>.</p><p>Reason: {1}</p>""") + .format(fileName, str(err))) + + @pyqtSlot() + def on_saveButton_clicked(self): + """ + Private slot to save the requirements text to the requirements file. + """ + fileName = self.requirementsFileEdit.text() + self.__writeToFile(fileName) + + @pyqtSlot() + def on_saveToButton_clicked(self): + """ + Private slot to write the requirements text to a new file. + """ + fileName, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( + self, + self.tr("Generate Requirements"), + os.path.expanduser("~"), + self.tr("Text Files (*.txt);;All Files (*)"), + None, + E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite) + ) + if fileName: + ext = os.path.splitext(fileName)[1] + if not ext: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fileName += ex + self.__writeToFile(fileName) + + @pyqtSlot() + def on_copyButton_clicked(self): + """ + Private slot to copy the requirements text to the clipboard. + """ + txt = self.requirementsEdit.toPlainText() + cb = QApplication.clipboard() + cb.setText(txt) + + @pyqtSlot() + def on_insertButton_clicked(self): + """ + Private slot to insert the requirements text at the cursor position + of the current editor. + """ + aw = e5App().getObject("ViewManager").activeWindow() + if aw: + aw.beginUndoAction() + aw.insert(self.requirementsEdit.toPlainText()) + aw.endUndoAction() + + @pyqtSlot() + def on_replaceSelectionButton_clicked(self): + """ + Private slot to replace the selected text of the current editor + with the requirements text. + """ + aw = e5App().getObject("ViewManager").activeWindow() + if aw: + aw.beginUndoAction() + aw.replaceSelectedText(self.requirementsEdit.toPlainText()) + aw.endUndoAction() + + @pyqtSlot() + def on_replaceAllButton_clicked(self): + """ + Private slot to replace the text of the current editor with the + requirements text. + """ + aw = e5App().getObject("ViewManager").activeWindow() + if aw: + aw.setText(self.requirementsEdit.toPlainText())
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,212 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipFreezeDialog</class> + <widget class="QDialog" name="PipFreezeDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>550</height> + </rect> + </property> + <property name="windowTitle"> + <string>Generate Requirements</string> + </property> + <property name="toolTip"> + <string>Replace the current selection with the requirements text</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QComboBox" name="pipComboBox"> + <property name="toolTip"> + <string>Select the pip command to use</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="localCheckBox"> + <property name="toolTip"> + <string>Select to show requirements for locally-installed packages only</string> + </property> + <property name="text"> + <string>Local packages only</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Requirements File:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="requirementsFileEdit"> + <property name="toolTip"> + <string>Enter the path of a requirements file</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="fileButton"> + <property name="toolTip"> + <string>Select the requirements file through a file selection dialog</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" rowspan="7"> + <widget class="QPlainTextEdit" name="requirementsEdit"> + <property name="tabChangesFocus"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QPushButton" name="saveButton"> + <property name="toolTip"> + <string>Press to save to the requirements file</string> + </property> + <property name="text"> + <string>Save</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="saveToButton"> + <property name="toolTip"> + <string>Save to a new file</string> + </property> + <property name="text"> + <string>Save To</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QPushButton" name="copyButton"> + <property name="toolTip"> + <string>Copy the requirements text to the clipboard</string> + </property> + <property name="text"> + <string>Copy</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QPushButton" name="insertButton"> + <property name="toolTip"> + <string>Insert the requirements text at the cursor position</string> + </property> + <property name="text"> + <string>Insert</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QPushButton" name="replaceSelectionButton"> + <property name="text"> + <string>Replace Selection</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QPushButton" name="replaceAllButton"> + <property name="toolTip"> + <string>Replace all text with the requirements text</string> + </property> + <property name="text"> + <string>Replace All</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>pipComboBox</tabstop> + <tabstop>localCheckBox</tabstop> + <tabstop>requirementsFileEdit</tabstop> + <tabstop>fileButton</tabstop> + <tabstop>requirementsEdit</tabstop> + <tabstop>saveButton</tabstop> + <tabstop>saveToButton</tabstop> + <tabstop>copyButton</tabstop> + <tabstop>insertButton</tabstop> + <tabstop>replaceSelectionButton</tabstop> + <tabstop>replaceAllButton</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PipFreezeDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PipFreezeDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipListDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to list installed packages. +""" + +from __future__ import unicode_literals +try: + str = unicode # __IGNORE_EXCEPTION__ +except NameError: + pass + +import json + +from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, \ + QApplication, QTreeWidgetItem, QHeaderView + +from E5Gui import E5MessageBox + +from .Ui_PipListDialog import Ui_PipListDialog + +import Preferences + + +class PipListDialog(QDialog, Ui_PipListDialog): + """ + Class implementing a dialog to list installed packages. + """ + CommandArguments = { + "list": ["list", "--format=json"], + "uptodate": ["list", "--uptodate", "--format=json"], + "outdated": ["list", "--outdated", "--format=json"], + } + + ShowProcessGeneralMode = 0 + ShowProcessClassifiersMode = 1 + ShowProcessEntryPointsMode = 2 + ShowProcessFilesListMode = 3 + + def __init__(self, pip, mode, plugin, title, parent=None): + """ + Constructor + + @param pip reference to the master object (Pip) + @param mode list command mode (string; one of 'list', + 'uptodate', 'outdated') + @param plugin reference to the plugin object (ToolPipPlugin) + @param title title of the dialog (string) + @param parent reference to the parent widget (QWidget) + """ + assert mode in PipListDialog.CommandArguments + + super(PipListDialog, self).__init__(parent) + self.setupUi(self) + self.setWindowFlags(Qt.Window) + + self.setWindowTitle(title) + + self.__refreshButton = self.buttonBox.addButton( + self.tr("&Refresh"), QDialogButtonBox.ActionRole) + self.__refreshButton.setEnabled(False) + if mode == "outdated": + self.__upgradeButton = self.buttonBox.addButton( + self.tr("Up&grade"), QDialogButtonBox.ActionRole) + self.__upgradeButton.setEnabled(False) + self.__upgradeAllButton = self.buttonBox.addButton( + self.tr("Upgrade &All"), QDialogButtonBox.ActionRole) + self.__upgradeAllButton.setEnabled(False) + else: + self.__upgradeButton = None + self.__upgradeAllButton = None + self.__uninstallButton = self.buttonBox.addButton( + self.tr("&Uninstall"), QDialogButtonBox.ActionRole) + self.__uninstallButton.setEnabled(False) + + self.__pip = pip + self.__mode = mode + self.__defaultCommand = plugin.getPreferences("CurrentPipExecutable") + self.__ioEncoding = Preferences.getSystem("IOEncoding") + self.__errors = "" + self.__output = [] + + self.__nothingStrings = { + "list": self.tr("Nothing to show"), + "uptodate": self.tr("All packages outdated"), + "outdated": self.tr("All packages up-to-date"), + } + + self.__default = self.tr("<Default>") + pipExecutables = sorted(plugin.getPreferences("PipExecutables")) + self.pipComboBox.addItem(self.__default) + self.pipComboBox.addItems(pipExecutables) + + if mode == "list": + self.infoLabel.setText(self.tr("Installed Packages:")) + self.packageList.setHeaderLabels([ + self.tr("Package"), + self.tr("Version"), + ]) + elif mode == "uptodate": + self.infoLabel.setText(self.tr("Up-to-date Packages:")) + self.packageList.setHeaderLabels([ + self.tr("Package"), + self.tr("Version"), + ]) + elif mode == "outdated": + self.infoLabel.setText(self.tr("Outdated Packages:")) + self.packageList.setHeaderLabels([ + self.tr("Package"), + self.tr("Current Version"), + self.tr("Latest Version"), + self.tr("Package Type"), + ]) + + self.packageList.header().setSortIndicator(0, Qt.AscendingOrder) + + self.__infoLabels = { + "name": self.tr("Name:"), + "version": self.tr("Version:"), + "location": self.tr("Location:"), + "requires": self.tr("Requires:"), + "summary": self.tr("Summary:"), + "home-page": self.tr("Homepage:"), + "author": self.tr("Author:"), + "author-email": self.tr("Author Email:"), + "license": self.tr("License:"), + "metadata-version": self.tr("Metadata Version:"), + "installer": self.tr("Installer:"), + "classifiers": self.tr("Classifiers:"), + "entry-points": self.tr("Entry Points:"), + "files": self.tr("Files:"), + } + self.infoWidget.setHeaderLabels(["Key", "Value"]) + + self.process = QProcess() + self.process.finished.connect(self.__procFinished) + self.process.readyReadStandardOutput.connect(self.__readStdout) + self.process.readyReadStandardError.connect(self.__readStderr) + + self.show() + QApplication.processEvents() + + def __stopProcess(self): + """ + Private slot to stop the running process. + """ + if self.process.state() != QProcess.NotRunning: + self.process.terminate() + QTimer.singleShot(2000, self.process.kill) + self.process.waitForFinished(3000) + + QApplication.restoreOverrideCursor() + + def closeEvent(self, e): + """ + Protected slot implementing a close event handler. + + @param e close event (QCloseEvent) + """ + self.__stopProcess() + e.accept() + + def __finish(self): + """ + Private slot called when the process finished or the user pressed + the cancel button. + """ + self.__stopProcess() + + self.__processOutput() + + self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) + self.buttonBox.button(QDialogButtonBox.Close).setFocus( + Qt.OtherFocusReason) + self.__refreshButton.setEnabled(True) + + if self.packageList.topLevelItemCount() == 0: + QTreeWidgetItem(self.packageList, + [self.__nothingStrings[self.__mode]]) + if self.__errors and not self.__errors.startswith("DEPRECATION"): + E5MessageBox.critical( + self, + self.windowTitle(), + self.tr("""<p>The pip command failed.</p>""" + """<p>Reason: {0}</p>""").format( + self.__errors.replace("\r\n", "<br/>") + .replace("\n", "<br/>").replace("\r", "<br/>") + .replace(" ", " "))) + if self.__upgradeAllButton is not None: + self.__upgradeAllButton.setEnabled(False) + else: + if self.__upgradeAllButton is not None: + self.__upgradeAllButton.setEnabled(True) + + self.packageList.sortItems( + 0, + self.packageList.header().sortIndicatorOrder()) + self.packageList.header().resizeSections( + QHeaderView.ResizeToContents) + self.packageList.header().setStretchLastSection(True) + + @pyqtSlot(QAbstractButton) + def on_buttonBox_clicked(self, button): + """ + Private slot called by a button of the button box clicked. + + @param button button that was clicked (QAbstractButton) + """ + if button == self.buttonBox.button(QDialogButtonBox.Close): + self.close() + elif button == self.buttonBox.button(QDialogButtonBox.Cancel): + self.__finish() + elif button == self.__refreshButton: + self.__refresh() + elif button == self.__upgradeButton: + self.__upgradePackages() + elif button == self.__upgradeAllButton: + self.__upgradeAllPackages() + elif button == self.__uninstallButton: + self.__uninstallPackages() + + def __procFinished(self, exitCode, exitStatus): + """ + Private slot connected to the finished signal. + + @param exitCode exit code of the process (integer) + @param exitStatus exit status of the process (QProcess.ExitStatus) + """ + self.__finish() + + def __refresh(self): + """ + Private slot to refresh the displayed list. + """ + self.__stopProcess() + self.start() + + def start(self): + """ + Public method to start the command. + """ + self.packageList.clear() + self.__errors = "" + self.__output = [] + + self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) + self.__refreshButton.setEnabled(False) + QApplication.processEvents() + + QApplication.setOverrideCursor(Qt.WaitCursor) + QApplication.processEvents() + + command = self.pipComboBox.currentText() + if command == self.__default: + command = self.__defaultCommand + + args = PipListDialog.CommandArguments[self.__mode][:] + if self.localCheckBox.isChecked(): + args.append("--local") + if self.notRequiredCheckBox.isChecked(): + args.append("--not-required") + + self.process.start(command, args) + procStarted = self.process.waitForStarted(5000) + if not procStarted: + self.buttonBox.setFocus() + self.__stopProcess() + E5MessageBox.critical( + self, + self.tr('Process Generation Error'), + self.tr( + 'The process {0} could not be started.' + ).format(command)) + self.__finish() + + def __processOutput(self): + """ + Private method to process the captured output. + """ + if self.__output: + packageData = json.loads("\n".join(self.__output)) + for package in packageData: + data = [ + package["name"], + package["version"], + ] + if self.__mode == "outdated": + data.extend([ + package["latest_version"], + package["latest_filetype"], + ]) + QTreeWidgetItem(self.packageList, data) + + def __readStdout(self): + """ + Private slot to handle the readyReadStandardOutput signal. + + It reads the output of the process, formats it and inserts it into + the contents pane. + """ + self.process.setReadChannel(QProcess.StandardOutput) + + while self.process.canReadLine(): + line = str(self.process.readLine(), self.__ioEncoding, + 'replace').strip() + self.__output.append(line) + + def __readStderr(self): + """ + Private slot to handle the readyReadStandardError signal. + + It reads the error output of the process and inserts it into the + error pane. + """ + self.__errors += str(self.process.readAllStandardError(), + self.__ioEncoding, 'replace') + + @pyqtSlot(str) + def on_pipComboBox_activated(self, txt): + """ + Private slot handling the selection of a pip executable. + + @param txt path of the pip executable (string) + """ + self.__refresh() + + @pyqtSlot(bool) + def on_localCheckBox_clicked(self, checked): + """ + Private slot handling the switching of the local mode. + + @param checked state of the local check box (boolean) + """ + self.__refresh() + + @pyqtSlot(bool) + def on_notRequiredCheckBox_clicked(self, checked): + """ + Private slot handling the switching of the 'not required' mode. + + @param checked state of the 'not required' check box (boolean) + """ + self.__refresh() + + @pyqtSlot() + def on_packageList_itemSelectionChanged(self): + """ + Private slot handling the selection of a package. + """ + self.infoWidget.clear() + + if len(self.packageList.selectedItems()) == 1: + itm = self.packageList.selectedItems()[0] + + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + + QApplication.setOverrideCursor(Qt.WaitCursor) + + args = ["show"] + if self.verboseCheckBox.isChecked(): + args.append("--verbose") + if self.installedFilesCheckBox.isChecked(): + args.append("--files") + args.append(itm.text(0)) + success, output = self.__pip.runProcess(args, cmd=command) + + if success and output: + mode = PipListDialog.ShowProcessGeneralMode + for line in output.splitlines(): + line = line.rstrip() + if line != "---": + if mode != PipListDialog.ShowProcessGeneralMode: + if line[0] == " ": + QTreeWidgetItem( + self.infoWidget, + [" ", line.strip()]) + else: + mode = PipListDialog.ShowProcessGeneralMode + if mode == PipListDialog.ShowProcessGeneralMode: + try: + label, info = line.split(": ", 1) + except ValueError: + label = line[:-1] + info = "" + label = label.lower() + if label in self.__infoLabels: + QTreeWidgetItem( + self.infoWidget, + [self.__infoLabels[label], info]) + if label == "files": + mode = PipListDialog.ShowProcessFilesListMode + elif label == "classifiers": + mode = PipListDialog.ShowProcessClassifiersMode + elif label == "entry-points": + mode = PipListDialog.ShowProcessEntryPointsMode + self.infoWidget.scrollToTop() + + header = self.infoWidget.header() + header.setStretchLastSection(False) + header.resizeSections(QHeaderView.ResizeToContents) + if header.sectionSize(0) + header.sectionSize(1) < header.width(): + header.setStretchLastSection(True) + + QApplication.restoreOverrideCursor() + + enable = (len(self.packageList.selectedItems()) > 1 or + (len(self.packageList.selectedItems()) == 1 and + self.packageList.selectedItems()[0].text(0) not in + self.__nothingStrings.values())) + self.__upgradeButton and self.__upgradeButton.setEnabled(enable) + self.__uninstallButton.setEnabled(enable) + + @pyqtSlot(bool) + def on_verboseCheckBox_clicked(self, checked): + """ + Private slot to handle a change of the verbose package information + checkbox. + + @param checked state of the checkbox + @type bool + """ + self.on_packageList_itemSelectionChanged() + + @pyqtSlot(bool) + def on_installedFilesCheckBox_clicked(self, checked): + """ + Private slot to handle a change of the installed files information + checkbox. + + @param checked state of the checkbox + @type bool + """ + self.on_packageList_itemSelectionChanged() + + def __upgradePackages(self): + """ + Private slot to upgrade the selected packages. + """ + packages = [] + for itm in self.packageList.selectedItems(): + packages.append(itm.text(0)) + + if packages: + if "pip" in packages: + self.__upgradePip() + else: + self.__executeUpgradePackages(packages) + + def __upgradeAllPackages(self): + """ + Private slot to upgrade all listed packages. + """ + packages = [] + for index in range(self.packageList.topLevelItemCount()): + itm = self.packageList.topLevelItem(index) + packages.append(itm.text(0)) + + if packages: + if "pip" in packages: + self.__upgradePip() + else: + self.__executeUpgradePackages(packages) + + def __upgradePip(self): + """ + Private slot to upgrade pip itself. + """ + pip = self.pipComboBox.currentText() + if pip == self.__default: + pip = "" + + res = self.__pip.upgradePip(pip=pip) + if res: + self.__refresh() + + def __executeUpgradePackages(self, packages): + """ + Private method to execute the pip upgrade command. + + @param packages list of package names to be upgraded + @type list of str + """ + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + + res = self.__pip.upgradePackages(packages, cmd=command) + if res: + self.__refresh() + + def __uninstallPackages(self): + """ + Private slot to uninstall the selected packages. + """ + packages = [] + for itm in self.packageList.selectedItems(): + packages.append(itm.text(0)) + + if packages: + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + + res = self.__pip.uninstallPackages(packages, cmd=command) + if res: + self.__refresh()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipListDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,225 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipListDialog</class> + <widget class="QDialog" name="PipListDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>550</height> + </rect> + </property> + <property name="windowTitle"> + <string>Package List</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QComboBox" name="pipComboBox"> + <property name="toolTip"> + <string>Select the pip command to use</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="infoLabel"> + <property name="text"> + <string notr="true">TextLabel</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="localCheckBox"> + <property name="toolTip"> + <string>Select to show only locally-installed packages</string> + </property> + <property name="text"> + <string>Local packages only</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="notRequiredCheckBox"> + <property name="toolTip"> + <string>Select to list packages that are not dependencies of installed packages</string> + </property> + <property name="text"> + <string>Not required Packages</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="childrenCollapsible"> + <bool>false</bool> + </property> + <widget class="QTreeWidget" name="packageList"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>3</verstretch> + </sizepolicy> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + </widget> + <widget class="QWidget" name="widget" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QCheckBox" name="verboseCheckBox"> + <property name="toolTip"> + <string>Select to show verbose package information</string> + </property> + <property name="text"> + <string>Verbose Package Information</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="installedFilesCheckBox"> + <property name="toolTip"> + <string>Select to show information about installed files</string> + </property> + <property name="text"> + <string>Installed Files Information</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTreeWidget" name="infoWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <attribute name="headerVisible"> + <bool>false</bool> + </attribute> + <attribute name="headerStretchLastSection"> + <bool>false</bool> + </attribute> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + <column> + <property name="text"> + <string notr="true">2</string> + </property> + </column> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>pipComboBox</tabstop> + <tabstop>localCheckBox</tabstop> + <tabstop>notRequiredCheckBox</tabstop> + <tabstop>packageList</tabstop> + <tabstop>verboseCheckBox</tabstop> + <tabstop>installedFilesCheckBox</tabstop> + <tabstop>infoWidget</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to show details about a package. +""" + +from __future__ import unicode_literals +try: + basestring # __IGNORE_WARNING__ +except NameError: + basestring = str + +from PyQt5.QtCore import Qt, QLocale +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem, \ + QLabel, QHeaderView + +from .Ui_PipPackageDetailsDialog import Ui_PipPackageDetailsDialog + + +class PipPackageDetailsDialog(QDialog, Ui_PipPackageDetailsDialog): + """ + Class documentation goes here. + """ + def __init__(self, detailsData, downloadsData, parent=None): + """ + Constructor + + @param detailsData package details (dict) + @param downloadsData downloads information (dict) + @param parent reference to the parent widget (QWidget) + """ + super(PipPackageDetailsDialog, self).__init__(parent) + self.setupUi(self) + + self.__locale = QLocale() + self.__packageTypeMap = { + "sdist": self.tr("Source"), + "bdist_wheel": self.tr("Python Wheel"), + "bdist_egg": self.tr("Python Egg"), + "bdist_wininst": self.tr("MS Windows Installer"), + "bdist_msi": self.tr("MS Windows Installer"), + "bdist_rpm": self.tr("Unix Installer"), + "bdist_deb": self.tr("Unix Installer"), + "bdist_dumb": self.tr("Archive"), + } + + self.__populateDetails(detailsData) + self.__populateDownloadUrls(downloadsData) + self.__populateRequiresProvides(detailsData) + + def __populateDetails(self, detailsData): + """ + Private method to populate the details tab. + + @param detailsData package details (dict) + """ + self.packageNameLabel.setText( + "<h1>{0} {1}</h1".format(self.__sanitize(detailsData["name"]), + self.__sanitize(detailsData["version"]))) + self.summaryLabel.setText( + self.__sanitize(detailsData["summary"][:240])) + self.descriptionEdit.setPlainText( + self.__sanitize(detailsData["description"])) + self.authorLabel.setText(self.__sanitize(detailsData["author"])) + self.authorEmailLabel.setText( + '<a href="mailto:{0}">{0}</a>'.format( + self.__sanitize(detailsData["author_email"]))) + self.licenseLabel.setText(self.__sanitize(detailsData["license"])) + self.platformLabel.setText(self.__sanitize(detailsData["platform"])) + self.homePageLabel.setText( + '<a href="{0}">{0}</a>'.format( + self.__sanitize(detailsData["home_page"], forUrl=True))) + self.packageUrlLabel.setText( + '<a href="{0}">{0}</a>'.format( + self.__sanitize(detailsData["package_url"], forUrl=True))) + self.releaseUrlLabel.setText( + '<a href="{0}">{0}</a>'.format( + self.__sanitize(detailsData["release_url"], forUrl=True))) + self.docsUrlLabel.setText( + '<a href="{0}">{0}</a>'.format( + self.__sanitize(detailsData["docs_url"], forUrl=True))) + self.downloadsDayLabel.setText(self.__locale.toString( + detailsData["downloads"]["last_day"])) + self.downloadsWeekLabel.setText(self.__locale.toString( + detailsData["downloads"]["last_week"])) + self.downloadsMonthLabel.setText(self.__locale.toString( + detailsData["downloads"]["last_month"])) + self.classifiersList.addItems(detailsData["classifiers"]) + + self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) + self.buttonBox.button(QDialogButtonBox.Close).setFocus( + Qt.OtherFocusReason) + + def __populateDownloadUrls(self, downloadsData): + """ + Private method to populate the download URLs tab. + + @param downloadsData downloads information (dict) + """ + index = self.infoWidget.indexOf(self.urls) + if downloadsData: + self.infoWidget.setTabEnabled(index, True) + for download in downloadsData: + itm = QTreeWidgetItem(self.downloadUrlsList, [ + "", + self.__packageTypeMap[download["packagetype"]] + if download["packagetype"] in self.__packageTypeMap + else "", + download["python_version"] + if download["python_version"] != "source" + else "", + self.__locale.toString(download["downloads"]), + self.__formatUploadDate(download["upload_time"]), + self.__formatSize(download["size"]), + ]) + if download["has_sig"]: + pgpLink = ' (<a href="{0}">pgp</a>)'.format( + download["url"] + ".asc") + else: + pgpLink = "" + urlLabel = QLabel('<a href="{0}#md5={2}">{1}</a>{3}'.format( + download["url"], download["filename"], + download["md5_digest"], pgpLink)) + urlLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + urlLabel.setOpenExternalLinks(True) + self.downloadUrlsList.setItemWidget(itm, 0, urlLabel) + header = self.downloadUrlsList.header() + header.resizeSections(QHeaderView.ResizeToContents) + else: + self.infoWidget.setTabEnabled(index, False) + + def __populateRequiresProvides(self, detailsData): + """ + Private method to populate the requires/provides tab. + + @param detailsData package details (dict) + """ + populated = False + + if "requires" in detailsData: + self.requiredPackagesList.addItems(detailsData["requires"]) + populated = True + if "requires_dist" in detailsData: + self.requiredDistributionsList.addItems( + detailsData["requires_dist"]) + populated = True + if "provides" in detailsData: + self.providedPackagesList.addItems(detailsData["provides"]) + populated = True + if "provides_dist" in detailsData: + self.providedDistributionsList.addItems( + detailsData["provides_dist"]) + populated = True + + index = self.infoWidget.indexOf(self.requires) + self.infoWidget.setTabEnabled(index, populated) + + def __sanitize(self, text, forUrl=False): + """ + Private method to clean-up the given text. + + @param text raw text (string) + @param forUrl flag indicating to sanitize an URL text (boolean) + @return processed text (string) + """ + if text == "UNKNOWN": + text = "" + elif text == "any": + text = self.tr("any") + elif text is None: + text = "" + if forUrl: + if not isinstance(text, basestring) or \ + not text.startswith(("http://", "https://", "ftp://")): + # ignore if the schema is not one of the listed ones + text = "" + + return text + + def __formatUploadDate(self, datetime): + """ + Private method to format the upload date. + + @param datetime upload date and time (xmlrpc.DateTime) + @return formatted date string (string) + """ + date = datetime.value.split("T")[0] + return "{0}-{1}-{2}".format(date[:4], date[4:6], date[6:]) + + def __formatSize(self, size): + """ + Private slot to format the size. + + @param size size to be formatted (integer) + @return formatted size (string) + """ + unit = "" + if size < 1024: + unit = self.tr("B") + elif size < 1024 * 1024: + size /= 1024 + unit = self.tr("KB") + elif size < 1024 * 1024 * 1024: + size /= 1024 * 1024 + unit = self.tr("MB") + else: + size /= 1024 * 1024 * 1024 + unit = self.tr("GB") + return self.tr("{0:.1f} {1}", "value, unit").format(size, unit)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,517 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipPackageDetailsDialog</class> + <widget class="QDialog" name="PipPackageDetailsDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>800</width> + <height>700</height> + </rect> + </property> + <property name="windowTitle"> + <string>Package Details</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="packageNameLabel"/> + </item> + <item> + <widget class="QTabWidget" name="infoWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="details"> + <attribute name="title"> + <string>Details</string> + </attribute> + <attribute name="toolTip"> + <string>Lists package informations</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="1"> + <widget class="QLabel" name="summaryLabel"> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Description:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="authorEmailLabel"> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPlainTextEdit" name="descriptionEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>5</verstretch> + </sizepolicy> + </property> + <property name="tabChangesFocus"> + <bool>true</bool> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Author:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="authorLabel"/> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Author Email:</string> + </property> + </widget> + </item> + <item row="7" column="1"> + <widget class="QLabel" name="packageUrlLabel"> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>License:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLabel" name="licenseLabel"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Summary:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Platform:</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QLabel" name="platformLabel"/> + </item> + <item row="6" column="0"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Home Page:</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <widget class="QLabel" name="homePageLabel"> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="7" column="0"> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Package URL:</string> + </property> + </widget> + </item> + <item row="8" column="0"> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Release URL:</string> + </property> + </widget> + </item> + <item row="8" column="1"> + <widget class="QLabel" name="releaseUrlLabel"> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="9" column="0"> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Documentation URL:</string> + </property> + </widget> + </item> + <item row="9" column="1"> + <widget class="QLabel" name="docsUrlLabel"> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="10" column="0"> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>Downloads:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="10" column="1"> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label_13"> + <property name="text"> + <string>Last Day:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="downloadsDayLabel"> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="0" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_14"> + <property name="text"> + <string>Last Week:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="downloadsWeekLabel"> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_15"> + <property name="text"> + <string>Last Month:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="downloadsMonthLabel"> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + </widget> + </item> + </layout> + </item> + <item row="11" column="0"> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string>Classifiers:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="11" column="1"> + <widget class="QListWidget" name="classifiersList"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="urls"> + <attribute name="title"> + <string>Download URLs</string> + </attribute> + <attribute name="toolTip"> + <string>Lists the download URLs</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QTreeWidget" name="downloadUrlsList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <attribute name="headerStretchLastSection"> + <bool>false</bool> + </attribute> + <column> + <property name="text"> + <string>File</string> + </property> + </column> + <column> + <property name="text"> + <string>Type</string> + </property> + </column> + <column> + <property name="text"> + <string>Py Version</string> + </property> + </column> + <column> + <property name="text"> + <string>Downloads</string> + </property> + </column> + <column> + <property name="text"> + <string>Uploaded on</string> + </property> + </column> + <column> + <property name="text"> + <string>Size</string> + </property> + </column> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="requires"> + <attribute name="title"> + <string>Requires/Provides</string> + </attribute> + <attribute name="toolTip"> + <string>Lists required and provided packages</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Requires</string> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string>Required Packages:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QListWidget" name="requiredPackagesList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string>Required Distributions:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QListWidget" name="requiredDistributionsList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Provides</string> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QLabel" name="label_20"> + <property name="text"> + <string>Provided Packages:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QListWidget" name="providedPackagesList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_19"> + <property name="text"> + <string>Provided Distributions:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QListWidget" name="providedDistributionsList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::NoSelection</enum> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>infoWidget</tabstop> + <tabstop>descriptionEdit</tabstop> + <tabstop>classifiersList</tabstop> + <tabstop>downloadUrlsList</tabstop> + <tabstop>requiredPackagesList</tabstop> + <tabstop>requiredDistributionsList</tabstop> + <tabstop>providedPackagesList</tabstop> + <tabstop>providedDistributionsList</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PipPackageDetailsDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PipPackageDetailsDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to enter package specifications. +""" + +from __future__ import unicode_literals + +from PyQt5.QtCore import pyqtSlot +from PyQt5.QtWidgets import QDialog, QDialogButtonBox + +from .Ui_PipPackagesInputDialog import Ui_PipPackagesInputDialog + + +class PipPackagesInputDialog(QDialog, Ui_PipPackagesInputDialog): + """ + Class documentation goes here. + """ + def __init__(self, plugin, title, parent=None): + """ + Constructor + + @param plugin reference to the plugin object (ToolPipPlugin) + @param title dialog title (string) + @param parent reference to the parent widget (QWidget) + """ + super(PipPackagesInputDialog, self).__init__(parent) + self.setupUi(self) + + self.setWindowTitle(title) + + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) + + self.__default = self.tr("<Default>") + pipExecutables = sorted(plugin.getPreferences("PipExecutables")) + self.pipComboBox.addItem(self.__default) + self.pipComboBox.addItems(pipExecutables) + + msh = self.minimumSizeHint() + self.resize(max(self.width(), msh.width()), msh.height()) + + @pyqtSlot(str) + def on_packagesEdit_textChanged(self, txt): + """ + Private slot handling entering package names. + + @param txt name of the requirements file (string) + """ + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(bool(txt)) + + def getData(self): + """ + Public method to get the entered data. + + @return tuple with the pip command (string) and the list of + package specifications (list of string) + """ + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + packages = [p.strip() for p in self.packagesEdit.text().split()] + + return command, packages
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipPackagesInputDialog</class> + <widget class="QDialog" name="PipPackagesInputDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>143</height> + </rect> + </property> + <property name="windowTitle"> + <string>Packages </string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Select the pip executable to be used:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="pipComboBox"> + <property name="toolTip"> + <string>Select the pip command to use</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Enter package specifications (separated by whitespace):</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="packagesEdit"/> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PipPackagesInputDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PipPackagesInputDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + + +""" +Module implementing a dialog to enter a requirements file. +""" + +from __future__ import unicode_literals + +import os + +from PyQt5.QtCore import pyqtSlot +from PyQt5.QtWidgets import QDialog, QDialogButtonBox + +from E5Gui import E5FileDialog + +from .Ui_PipRequirementsSelectionDialog import \ + Ui_PipRequirementsSelectionDialog + +import Utilities +import UI.PixmapCache + + +class PipRequirementsSelectionDialog(QDialog, + Ui_PipRequirementsSelectionDialog): + """ + Class implementing a dialog to enter a requirements file. + """ + def __init__(self, plugin, parent=None): + """ + Constructor + + @param plugin reference to the plugin object (ToolPipPlugin) + @param parent reference to the parent widget (QWidget) + """ + super(PipRequirementsSelectionDialog, self).__init__(parent) + self.setupUi(self) + + self.fileButton.setIcon(UI.PixmapCache.getIcon("open.png")) + + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) + + self.__default = self.tr("<Default>") + pipExecutables = sorted(plugin.getPreferences("PipExecutables")) + self.pipComboBox.addItem(self.__default) + self.pipComboBox.addItems(pipExecutables) + + msh = self.minimumSizeHint() + self.resize(max(self.width(), msh.width()), msh.height()) + + @pyqtSlot() + def on_fileButton_clicked(self): + """ + Private slot to enter the requirements file via a file selection + dialog. + """ + fileName = E5FileDialog.getOpenFileName( + self, + self.tr("Select the requirements file"), + self.requirementsEdit.text() or os.path.expanduser("~"), + self.tr("Text Files (*.txt);;All Files (*)") + ) + if fileName: + self.requirementsEdit.setText( + Utilities.toNativeSeparators(fileName)) + + @pyqtSlot(str) + def on_requirementsEdit_textChanged(self, txt): + """ + Private slot handling entering the name of a requirements file. + + @param txt name of the requirements file (string) + """ + self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( + bool(txt) and + os.path.exists(Utilities.toNativeSeparators(txt)) + ) + + def getData(self): + """ + Public method to get the entered data. + + @return tuple with the pip command (string) and the name of the + requirements file (string) + """ + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + + return command, self.requirementsEdit.text()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipRequirementsSelectionDialog</class> + <widget class="QDialog" name="PipRequirementsSelectionDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>600</width> + <height>143</height> + </rect> + </property> + <property name="windowTitle"> + <string>Select Requirements</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Select the pip executable to be used:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="pipComboBox"> + <property name="toolTip"> + <string>Select the pip command to use</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Enter requirements file:</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLineEdit" name="requirementsEdit"/> + </item> + <item> + <widget class="QToolButton" name="fileButton"> + <property name="toolTip"> + <string>Select the requirements file through a file selection dialog</string> + </property> + <property name="text"> + <string notr="true"/> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>PipRequirementsSelectionDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>PipRequirementsSelectionDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,432 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to search PyPI. +""" + +from __future__ import unicode_literals + +import textwrap + +from PyQt5.QtCore import pyqtSlot, Qt, QEventLoop, QRegExp +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, \ + QApplication, QTreeWidgetItem, QHeaderView, QInputDialog + +from E5Gui import E5MessageBox +try: + from E5Network.E5XmlRpcClient import E5XmlRpcClient +except ImportError: + from .E5XmlRpcClient import E5XmlRpcClient + +from .Ui_PipSearchDialog import Ui_PipSearchDialog + +from . import DefaultIndexUrl + + +class PipSearchDialog(QDialog, Ui_PipSearchDialog): + """ + Class implementing a dialog to search PyPI. + """ + VersionRole = Qt.UserRole + 1 + + Stopwords = { + "a", "and", "are", "as", "at", "be", "but", "by", + "for", "if", "in", "into", "is", "it", + "no", "not", "of", "on", "or", "such", + "that", "the", "their", "then", "there", "these", + "they", "this", "to", "was", "will", + } + + def __init__(self, pip, plugin, parent=None): + """ + Constructor + + @param pip reference to the master object (Pip) + @param plugin reference to the plugin object (ToolPipPlugin) + @param parent reference to the parent widget (QWidget) + """ + super(PipSearchDialog, self).__init__(parent) + self.setupUi(self) + self.setWindowFlags(Qt.Window) + + self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False) + + self.__installButton = self.buttonBox.addButton( + self.tr("&Install"), QDialogButtonBox.ActionRole) + self.__installButton.setEnabled(False) + + self.__showDetailsButton = self.buttonBox.addButton( + self.tr("&Show Details..."), QDialogButtonBox.ActionRole) + self.__showDetailsButton.setEnabled(False) + + self.__pip = pip + self.__client = E5XmlRpcClient( + plugin.getPreferences("PipSearchIndex") or DefaultIndexUrl, + self) + + self.__default = self.tr("<Default>") + pipExecutables = sorted(plugin.getPreferences("PipExecutables")) + self.pipComboBox.addItem(self.__default) + self.pipComboBox.addItems(pipExecutables) + + self.searchEdit.setFocus(Qt.OtherFocusReason) + + self.__canceled = False + self.__detailsData = {} + self.__query = [] + + def closeEvent(self, e): + """ + Protected slot implementing a close event handler. + + @param e close event (QCloseEvent) + """ + QApplication.restoreOverrideCursor() + e.accept() + + @pyqtSlot(str) + def on_searchEdit_textChanged(self, txt): + """ + Private slot handling a change of the search term. + + @param txt search term (string) + """ + self.searchButton.setEnabled(bool(txt)) + + @pyqtSlot() + def on_searchButton_clicked(self): + """ + Private slot handling a press of the search button. + """ + self.__search() + + @pyqtSlot() + def on_resultList_itemSelectionChanged(self): + """ + Private slot handling changes of the selection. + """ + self.__installButton.setEnabled( + len(self.resultList.selectedItems()) > 0) + self.__showDetailsButton.setEnabled( + len(self.resultList.selectedItems()) == 1) + + @pyqtSlot(QAbstractButton) + def on_buttonBox_clicked(self, button): + """ + Private slot called by a button of the button box clicked. + + @param button button that was clicked (QAbstractButton) + """ + if button == self.buttonBox.button(QDialogButtonBox.Close): + self.close() + elif button == self.buttonBox.button(QDialogButtonBox.Cancel): + self.__client.abort() + self.__canceled = True + elif button == self.__installButton: + self.__install() + elif button == self.__showDetailsButton: + self.__showDetails() + + def __search(self): + """ + Private method to perform the search. + """ + self.resultList.clear() + self.infoLabel.clear() + + self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) + self.searchButton.setEnabled(False) + QApplication.processEvents(QEventLoop.ExcludeUserInputEvents) + + QApplication.setOverrideCursor(Qt.WaitCursor) + QApplication.processEvents(QEventLoop.ExcludeUserInputEvents) + + self.__canceled = False + + self.__query = [term for term in self.searchEdit.text().strip().split() + if term not in PipSearchDialog.Stopwords] + self.__client.call( + "search", + ({"name": self.__query, "summary": self.__query}, "or"), + self.__processSearchResult, + self.__searchError + ) + + def __processSearchResult(self, data): + """ + Private method to process the search result data from PyPI. + + @param data result data (tuple) with hits in the first element + """ + if data: + packages = self.__transformHits(data[0]) + if packages: + self.infoLabel.setText(self.tr("%n package(s) found.", "", + len(packages))) + wrapper = textwrap.TextWrapper(width=80) + count = 0 + total = 0 + for package in packages: + if self.__canceled: + self.infoLabel.setText( + self.tr("Canceled - only {0} out of %n package(s)" + " shown", "", len(packages)).format(total)) + break + itm = QTreeWidgetItem( + self.resultList, [ + package['name'].strip(), + "{0:4d}".format(package['score']), + "\n".join([ + wrapper.fill(line) for line in + package['summary'].strip().splitlines() + ]) + ]) + itm.setData(0, self.VersionRole, package['version']) + count += 1 + total += 1 + if count == 100: + count = 0 + QApplication.processEvents() + else: + QApplication.restoreOverrideCursor() + E5MessageBox.warning( + self, + self.tr("Search PyPI"), + self.tr("""<p>The package search did not return""" + """ anything.</p>""")) + self.infoLabel.setText( + self.tr("""<p>The package search did not return""" + """ anything.</p>""")) + else: + QApplication.restoreOverrideCursor() + E5MessageBox.warning( + self, + self.tr("Search PyPI"), + self.tr("""<p>The package search did not return anything.""" + """</p>""")) + self.infoLabel.setText( + self.tr("""<p>The package search did not return anything.""" + """</p>""")) + + header = self.resultList.header() + self.resultList.sortItems(1, Qt.DescendingOrder) + header.setStretchLastSection(False) + header.resizeSections(QHeaderView.ResizeToContents) + headerSize = 0 + for col in range(header.count()): + headerSize += header.sectionSize(col) + if headerSize < header.width(): + header.setStretchLastSection(True) + + self.__finish() + + def __finish(self): + """ + Private slot performing the finishing actions. + """ + QApplication.restoreOverrideCursor() + self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False) + self.searchButton.setEnabled(True) + self.searchButton.setDefault(True) + self.searchEdit.setFocus(Qt.OtherFocusReason) + + def __searchError(self, errorCode, errorString): + """ + Private method handling a search error. + + @param errorCode code of the error (integer) + @param errorString error message (string) + """ + self.__finish() + E5MessageBox.warning( + self, + self.tr("Search PyPI"), + self.tr("""<p>The package search failed.</p><p>Reason: {0}</p>""") + .format(errorString)) + self.infoLabel.setText(self.tr("Error: {0}").format(errorString)) + + def __transformHits(self, hits): + """ + Private method to convert the list returned from pypi into a + packages list. + + @param hits list returned from pypi (list of dict) + @return list of packages (list of dict) + """ + # we only include the record with the highest score + packages = {} + for hit in hits: + name = hit['name'].strip() + summary = (hit['summary'] or "").strip() + version = hit['version'].strip() + score = self.__score(name, summary) + # cleanup the summary + if summary in ["UNKNOWN", "."]: + summary = "" + + if name not in packages: + packages[name] = { + 'name': name, + 'summary': summary, + 'version': [version.strip()], + 'score': score} + else: + # TODO: allow for multiple versions using highest score + if score > packages[name]['score']: + packages[name]['score'] = score + packages[name]['summary'] = summary + packages[name]['version'].append(version.strip()) + + return list(packages.values()) + + def __score(self, name, summary): + """ + Private method to calculate some score for a search result. + + @param name name of the returned package + @type str + @param summary summary text for the package + @type str + @return score value + @rtype int + """ + score = 0 + for queryTerm in self.__query: + if queryTerm.lower() in name.lower(): + score += 4 + if queryTerm.lower() == name.lower(): + score += 4 + + if queryTerm.lower() in summary.lower(): + if QRegExp(r'\b{0}\b'.format(QRegExp.escape(queryTerm)), + Qt.CaseInsensitive).indexIn(summary) != -1: + # word match gets even higher score + score += 2 + else: + score += 1 + + return score + + def __install(self): + """ + Private slot to install the selected packages. + """ + command = self.pipComboBox.currentText() + if command == self.__default: + command = "" + + packages = [] + for itm in self.resultList.selectedItems(): + packages.append(itm.text(0).strip()) + if packages: + self.__pip.installPackages(packages, cmd=command) + + def __showDetails(self): + """ + Private slot to show details about the selected package. + """ + self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) + self.__showDetailsButton.setEnabled(False) + QApplication.setOverrideCursor(Qt.WaitCursor) + QApplication.processEvents(QEventLoop.ExcludeUserInputEvents) + + self.__detailsData = {} + + itm = self.resultList.selectedItems()[0] + packageVersions = itm.data(0, self.VersionRole) + if len(packageVersions) == 1: + packageVersion = packageVersions[0] + elif len(packageVersions) == 0: + packageVersion = "" + else: + packageVersion, ok = QInputDialog.getItem( + self, + self.tr("Show Package Details"), + self.tr("Select the package version:"), + packageVersions, + 0, False) + if not ok: + return + + packageName = itm.text(0) + self.__client.call( + "release_data", + (packageName, packageVersion), + lambda d: self.__getPackageDownloadsData(packageVersion, d), + self.__detailsError + ) + + def __getPackageDownloadsData(self, packageVersion, data): + """ + Private method to store the details data and get downloads + information. + + @param packageVersion version info + @type str + @param data result data with package details in the first + element + @type tuple + """ + if data and data[0]: + self.__detailsData = data[0] + itm = self.resultList.selectedItems()[0] + packageName = itm.text(0) + self.__client.call( + "release_urls", + (packageName, packageVersion), + self.__displayPackageDetails, + self.__detailsError + ) + else: + self.__finish() + E5MessageBox.warning( + self, + self.tr("Search PyPI"), + self.tr("""<p>No package details info available.</p>""")) + + def __displayPackageDetails(self, data): + """ + Private method to display the returned package details. + + @param data result data (tuple) with downloads information in the first + element + """ + self.__finish() + self.__showDetailsButton.setEnabled(True) + from .PipPackageDetailsDialog import PipPackageDetailsDialog + dlg = PipPackageDetailsDialog(self.__detailsData, data[0], self) + dlg.exec_() + + def __detailsError(self, errorCode, errorString): + """ + Private method handling a details error. + + @param errorCode code of the error (integer) + @param errorString error message (string) + """ + self.__finish() + self.__showDetailsButton.setEnabled(True) + E5MessageBox.warning( + self, + self.tr("Search PyPI"), + self.tr("""<p>Package details info could not be retrieved.</p>""" + """<p>Reason: {0}</p>""") + .format(errorString)) + + @pyqtSlot(QTreeWidgetItem, int) + def on_resultList_itemActivated(self, item, column): + """ + Private slot reacting on an item activation. + + @param item reference to the activated item (QTreeWidgetItem) + @param column activated column (integer) + """ + self.__showDetails()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.ui Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PipSearchDialog</class> + <widget class="QDialog" name="PipSearchDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>700</width> + <height>600</height> + </rect> + </property> + <property name="windowTitle"> + <string>Search PyPI</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QComboBox" name="pipComboBox"> + <property name="toolTip"> + <string>Select the pip command to use for installing packages</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Query:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="searchEdit"> + <property name="toolTip"> + <string>Enter the search term</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="searchButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="toolTip"> + <string>Press to start the search</string> + </property> + <property name="text"> + <string>Search</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTreeWidget" name="resultList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="allColumnsShowFocus"> + <bool>true</bool> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <column> + <property name="text"> + <string>Package</string> + </property> + </column> + <column> + <property name="text"> + <string>Score</string> + </property> + </column> + <column> + <property name="text"> + <string>Description</string> + </property> + </column> + </widget> + </item> + <item> + <widget class="QLabel" name="infoLabel"/> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/PipInterface/__init__.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 - 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the various pip dialogs and data. +""" + +from __future__ import unicode_literals + +DefaultIndexUrl = "https://pypi.python.org/pypi"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugins/UiExtensionPlugins/__init__.py Sat Dec 09 18:32:08 2017 +0100 @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package containing the various interface extension plug-ins. +"""
--- a/changelog Sat Dec 09 17:43:24 2017 +0100 +++ b/changelog Sat Dec 09 18:32:08 2017 +0100 @@ -5,6 +5,8 @@ - Project -- If a project does not contain protobuf files, the old project file format (5.1) is generated to make the file backward compatible. +- Plug-ins + -- added the pip interface plug-in to the core plug-ins Version 17.12: - bug fixes
--- a/eric6.e4p Sat Dec 09 17:43:24 2017 +0100 +++ b/eric6.e4p Sat Dec 09 18:32:08 2017 +0100 @@ -508,6 +508,7 @@ <Source>Plugins/PluginCodeStyleChecker.py</Source> <Source>Plugins/PluginEricapi.py</Source> <Source>Plugins/PluginEricdoc.py</Source> + <Source>Plugins/PluginPipInterface.py</Source> <Source>Plugins/PluginSyntaxChecker.py</Source> <Source>Plugins/PluginTabnanny.py</Source> <Source>Plugins/PluginVcsMercurial.py</Source> @@ -524,6 +525,18 @@ <Source>Plugins/PluginWizardQMessageBox.py</Source> <Source>Plugins/PluginWizardQRegExp.py</Source> <Source>Plugins/PluginWizardQRegularExpression.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/__init__.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/Pip.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipListDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py</Source> + <Source>Plugins/UiExtensionPlugins/PipInterface/__init__.py</Source> + <Source>Plugins/UiExtensionPlugins/__init__.py</Source> <Source>Plugins/VcsPlugins/__init__.py</Source> <Source>Plugins/VcsPlugins/vcsMercurial/Config.py</Source> <Source>Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py</Source> @@ -1678,6 +1691,14 @@ <Form>Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.ui</Form> <Form>Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.ui</Form> <Form>Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/ConfigurationPage/PipPage.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipListDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipPackageDetailsDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipPackagesInputDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipRequirementsSelectionDialog.ui</Form> + <Form>Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.ui</Form> <Form>Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui</Form> <Form>Plugins/VcsPlugins/vcsMercurial/FetchExtension/HgFetchDialog.ui</Form> <Form>Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.ui</Form>
--- a/i18n/eric6_cs.ts Sat Dec 09 17:43:24 2017 +0100 +++ b/i18n/eric6_cs.ts Sat Dec 09 18:32:08 2017 +0100 @@ -40545,6 +40545,1330 @@ </message> </context> <context> + <name>Pip</name> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="547"/> + <source>pip Executable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="59"/> + <source>pip &Executable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="64"/> + <source>Selects the pip executable to be used</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="66"/> + <source><b>pip Executable</b><p>This selects the pip executable to be used. Multiple executables can be pre-configured via the configuration dialog.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="79"/> + <source>List Installed Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="79"/> + <source>&List Installed Packages...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="84"/> + <source>List all installed packages with versions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="86"/> + <source><b>List Installed Packages</b><p>This lists all the installed packages together with their versions.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="94"/> + <source>List Up-to-date Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="94"/> + <source>List Up-to-&date Packages...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="99"/> + <source>List all installed, up-to-date packages with versions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="101"/> + <source><b>List Up-to-date Packages</b><p>This lists all the installed, up-to-date packages together with their versions.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="110"/> + <source>List Outdated Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="110"/> + <source>List &Outdated Packages...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="115"/> + <source>List all installed, outdated packages with versions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="117"/> + <source><b>List Up-to-date Packages</b><p>This lists all the installed, outdated packages together with their current and latest versions.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="886"/> + <source>Install Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="130"/> + <source>&Install Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="135"/> + <source>Install packages according to user input</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="137"/> + <source><b>Install Packages</b><p>This installs packages according to user input.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="144"/> + <source>Install Requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="149"/> + <source>Install packages according to a requirements file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="151"/> + <source><b>Install Requirements</b><p>This installs packages according to a requirements file.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="160"/> + <source>Install Pip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="165"/> + <source>Install the pip package itself</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="167"/> + <source><b>Install Pip</b><p>This install the pip package itself.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="174"/> + <source>Repair Pip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="179"/> + <source>Repair the pip package</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="181"/> + <source><b>Repair Pip</b><p>This repairs the pip package by re-installing it.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="188"/> + <source>Upgrade Pip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="188"/> + <source>Upgrade &Pip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="193"/> + <source>Upgrade the pip package itself</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="195"/> + <source><b>Upgrade Pip</b><p>This upgrades the pip package itself.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="859"/> + <source>Upgrade Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="202"/> + <source>&Upgrade Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="207"/> + <source>Upgrade packages according to user input</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="209"/> + <source><b>Upgrade Packages</b><p>This upgrades packages according to user input.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="971"/> + <source>Uninstall Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="225"/> + <source>Uninstall packages according to user input</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="227"/> + <source><b>Uninstall Packages</b><p>This uninstalls packages according to user input.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="234"/> + <source>Uninstall Requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="239"/> + <source>Uninstall packages according to a requirements file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="241"/> + <source><b>Uninstall Requirements</b><p>This uninstalls packages according to a requirements file.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="254"/> + <source>Generate Requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="254"/> + <source>&Generate Requirements...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="259"/> + <source>Generate the contents of a requirements file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="261"/> + <source><b>Generate Requirements</b><p>This generates the contents of a requirements file.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="273"/> + <source>Search PyPI</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="273"/> + <source>&Search PyPI...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="278"/> + <source>Open a dialog to search the Python Package Index</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="280"/> + <source><b>Search PyPI</b><p>This opens a dialog to search the Python Package Index.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="292"/> + <source>Edit User Configuration</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="292"/> + <source>Edit User Configuration...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="297"/> + <source>Open the per user configuration file in an editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="299"/> + <source><b>Edit User Configuration</b><p>This opens the per user configuration file in an editor.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="307"/> + <source>Edit Current Virtualenv Configuration</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="307"/> + <source>Edit Current Virtualenv Configuration...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="312"/> + <source>Open the current virtualenv configuration file in an editor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="314"/> + <source><b>Edit Current Virtualenv Configuration</b><p>This opens the current virtualenv configuration file in an editor. </p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="323"/> + <source>Configure</source> + <translation type="unfinished">Konfigurovat</translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="323"/> + <source>Configure...</source> + <translation type="unfinished">Konfigurovat...</translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="327"/> + <source>Show the configuration dialog with the Python Package Management page selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="331"/> + <source><b>Configure</b><p>Show the configuration dialog with the Python Package Management page selected.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="347"/> + <source>P&ython Package Management</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="462"/> + <source>pip exited with an error ({0}).</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="469"/> + <source>pip did not finish within 30 seconds.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="471"/> + <source>pip could not be started.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="537"/> + <source>Select pip Executable to be used:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="547"/> + <source>No pip executables have been configured yet. Shall this be done now?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="561"/> + <source>Installed Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="571"/> + <source>Up-to-date Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="581"/> + <source>Outdated Packages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="641"/> + <source>Edit Configuration</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="641"/> + <source>No valid configuartion path determined. Is a virtual environment selected? Aborting</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="746"/> + <source>Select Python Executable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="660"/> + <source>Install PIP</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="667"/> + <source>Select PIP Executable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="729"/> + <source><Default></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="732"/> + <source>Upgrade pip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="732"/> + <source>Select pip Executable:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="721"/> + <source>Upgrade PIP</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="757"/> + <source>Repair PIP</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="821"/> + <source>You are trying to upgrade PyQt packages. This will not work for the current instance of Python ({0}). Do you want to continue?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="907"/> + <source>Install Packages from Requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="971"/> + <source>Do you really want to uninstall these packages?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/Pip.py" line="982"/> + <source>Uninstall Packages from Requirements</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PipDialog</name> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui" line="14"/> + <source>pip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui" line="29"/> + <source>Output</source> + <translation type="unfinished">Výstup</translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.ui" line="54"/> + <source>Errors</source> + <translation type="unfinished">Chyby</translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.py" line="133"/> + <source>Process Generation Error</source> + <translation type="unfinished">Chyba v procesu generování</translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipDialog.py" line="133"/> + <source>The process {0} could not be started.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PipFreezeDialog</name> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.py" line="250"/> + <source>Generate Requirements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Plugins/UiExtensionPlugins/PipInterface/PipFreezeDialog.ui" line="17"/>