def update_label(self): """ Show the currently selected folder containing virtual environments. """ head = ( '<span style="font-size: 13pt;">\ <b>Virtual environments:</b>\ </span>' ) no_folder = ( '<span style="font-size: 13pt; color: #ff0000;">\ <i> --- please select a folder containing virtual environments</i>\ </span>' ) with_folder = ( f'<span style="font-size: 13pt; color: #0059ff;">\ {get_data.get_active_dir_str()}\ </span>' ) if get_data.get_active_dir_str() != "": self.venv_table_label.setText(f"{head}{with_folder}") else: self.venv_table_label.setText(f"{head}{no_folder}")
def save_requires(self, event): """ Write the requirements of the selected environment to file. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() venv_dir = os.path.join(active_dir, venv) if self.has_pip(active_dir, venv): save_file = QFileDialog.getSaveFileName( self, "Save requirements", directory=f"{venv_dir}/requirements.txt") save_path = save_file[0] if save_path != "": logger.info(f"Saving '{save_path}'...") # write 'pip freeze' output to selected file self.manager = PipManager(active_dir, venv) self.manager.run_pip(creator.cmds[2], [">", save_path]) # show an info message message_txt = (f"Saved requirements in \n{save_path}") QMessageBox.information(self, "Saved", message_txt)
def deptree_packages(self, event, style): """ Test if `pipdeptree` is installed and ask user wether to install it if it's not. Then call `self.list_packages()` """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() pipdeptree_binary = os.path.join(active_dir, venv, "bin", "pipdeptree") has_pipdeptree = os.path.exists(pipdeptree_binary) message_txt = ( "This requires the pipdeptree package\nto be installed.\n\n" "Do you want to install it?\n") if has_pipdeptree: self.list_packages(event, style) else: if self.has_pip(active_dir, venv): msg_box_confirm = QMessageBox.question( self, "Confirm", message_txt, QMessageBox.Yes | QMessageBox.Cancel) if msg_box_confirm == QMessageBox.Yes: self.progress_bar.setWindowTitle("Installing") self.progress_bar.status_label.setText( "Installing pipdeptree...") logger.info("Installing pipdeptree...") self.manager = PipManager(active_dir, venv) self.manager.run_pip(creator.cmds[0], [creator.opts[0], "pipdeptree"]) self.manager.started.connect(self.progress_bar.exec_) self.manager.finished.connect(self.progress_bar.close) self.manager.process_stop() self.list_packages(event, style)
def install_local(self, event): """Install from a local project. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() if self.has_pip(active_dir, venv): project_dir = QFileDialog.getExistingDirectory( self, "Select project directory") project_name = os.path.basename(project_dir) if project_dir != "": self.console.setWindowTitle(f"Installing {project_name}") logger.info("Installing from local project path...") self.manager = PipManager(active_dir, venv) self.manager.run_pip(creator.cmds[0], [creator.opts[2], f"'{project_dir}'"]) self.manager.started.connect(self.console.exec_) # display the updated output self.manager.textChanged.connect(self.console.update_status) # clear the content on window close if self.console.close: self.console.console_window.clear()
def install_requires(self, event): """ Install packages from a requirements file into the selected environment. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() if self.has_pip(active_dir, venv): file_name = QFileDialog.getOpenFileName(self, "Select a requirements") file_path = file_name[0] if file_path != "": creator.fix_requirements(file_path) self.console.setWindowTitle("Installing from requirements") logger.info("Installing from requirements...") self.manager = PipManager(active_dir, venv) self.manager.run_pip(creator.cmds[0], [creator.opts[1], f"'{file_path}'"]) self.manager.started.connect(self.console.exec_) # display the updated output self.manager.textChanged.connect(self.console.update_status) # clear the content on window close if self.console.close: self.console.console_window.clear()
def open_venv_dir(self, event): """Open the selected venv directory. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() venv_dir = os.path.join(active_dir, venv) if os.path.isdir(venv_dir): os.system(f"xdg-open '{venv_dir}'")
def delete_venv(self, event): """ Delete the selected virtual environment by clicking delete from the context menu in venv table. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() venv_path = os.path.join(active_dir, venv) if self.venv_exists(venv_path): msg_box_critical = QMessageBox.critical( self, "Confirm", f"Are you sure you want to delete '{venv}'?", QMessageBox.Yes | QMessageBox.Cancel) if msg_box_critical == QMessageBox.Yes: shutil.rmtree(venv_path) logging.info(f"Successfully deleted '{venv_path}'") self.refresh.emit()
def upgrade_pip(self, event): """Run `pip install --upgrade pip` command. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() if self.has_pip(active_dir, venv): self.console.setWindowTitle("Updating Pip") logger.info("Attempting to update Pip...") self.manager = PipManager(active_dir, venv) self.manager.run_pip(creator.cmds[0], [creator.opts[0], "pip"]) self.manager.started.connect(self.console.exec_) # display the updated output self.manager.textChanged.connect(self.console.update_status) # clear the content on window close if self.console.close: self.console.console_window.clear()
def list_packages(self, event, style): """ Open console dialog and list the installed packages. The argument `style` controls which style the output should have: `style=1` for `pip list`, `style=2` for `pip freeze` and style=3 for a dependency output via `pipdeptree`. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() if self.has_pip(active_dir, venv): self.console.setWindowTitle(f"Packages installed in: {venv}") self.manager = PipManager(active_dir, f"'{venv}'") self.manager.run_pip(creator.cmds[style]) self.manager.started.connect(self.console.exec_) # display the updated output self.manager.textChanged.connect(self.console.update_status) # clear the content on window close if self.console.close: self.console.console_window.clear()
def install_vsc(self, event): """Install from a VSC repository. """ active_dir = get_data.get_active_dir_str() venv = self.get_selected_item() venv_bin = os.path.join(active_dir, venv, "bin", "python") if self.has_pip(active_dir, venv): url, ok = QInputDialog.getText( self, "Specify VSC project url", "Enter url to repository:" + " " * 65) if url != "": project_name = os.path.basename(url) project_url = f"git+{url}#egg={project_name}" cmd = ( f"{venv_bin} -m pip install --no-cache-dir -e {project_url}" ) self.progress_bar.setWindowTitle(f"Installing {project_name}") self.progress_bar.status_label.setText("Cloning repository...") logger.info(f"Installing {project_name}...") wrapper = partial(self.m_clone_repo_worker.run_process, cmd) QTimer.singleShot(0, wrapper)