# -*- coding: utf-8 -*-"""Virtualenv management related automation."""importtypingasTimportshutilimportsubprocessimportdataclassesfrom.vendor.emojiimportEmojifrom.vendor.better_pathlibimporttemp_cwdfrom.loggerimportloggerfrom.helpersimportprint_commandifT.TYPE_CHECKING:# pragma: no coverfrom.defineimportPyWf
[docs]@dataclasses.dataclassclassPyWfVenv:""" Namespace class for Virtualenv management related automation. """@logger.emoji_block(msg="Create Virtual Environment",emoji=Emoji.python,)def_create_virtualenv(self:"PyWf",real_run:bool=True,quiet:bool=False,)->bool:""" Run: .. code-block:: bash $ poetry env use python${X}.${Y} :return: a boolean flat to indicate whether a creation is performed. """ifself.dir_venv.exists():logger.info(f"{self.dir_venv} already exists, do nothing.")returnFalseelse:# Ref: https://python-poetry.org/docs/managing-environments/# note that we defined to use in-project = true in poetry.toml fileargs=[f"{self.path_bin_poetry}","config","virtualenvs.in-project","true",]ifquiet:args.append("--quiet")self.run_command(args,real_run=real_run)args=[f"{self.path_bin_poetry}","env","use",f"python{self.py_ver_major}.{self.py_ver_minor}",]ifquiet:args.append("--quiet")self.run_command(args,real_run=real_run)logger.info("done")returnTrue
[docs]defcreate_virtualenv(self:"PyWf",real_run:bool=True,verbose:bool=True,)->bool:# pragma: no coverwithlogger.disabled(notverbose):returnself._create_virtualenv(real_run=real_run,quiet=notverbose,)
create_virtualenv.__doc__=_create_virtualenv.__doc__@logger.emoji_block(msg="Remove Virtual Environment",emoji=Emoji.python,)def_remove_virtualenv(self:"PyWf",real_run:bool=True,quiet:bool=False,)->bool:""" Run: .. code-block:: bash $ rm -r /path/to/.venv :return: a boolean flag to indicate whether a deletion is performed. """ifself.dir_venv.exists():args=["rm","-r",f"{self.dir_venv}",]self.run_command(args,real_run)# print_command(args)# if real_run:# shutil.rmtree(f"{self.dir_venv}", ignore_errors=True)logger.info(f"done! {self.dir_venv} is removed.")returnTrueelse:logger.info(f"{self.dir_venv} doesn't exists, do nothing.")returnFalse