Source code for pydmt.builders.venv
"""
This module builds python virtual envrionments
"""
import os
import shutil
from pydmt.utils.filesystem import mkdir_touch
from pydmt.utils.subprocess import check_call, check_call_ve
from pydmt.utils.python import collect_reqs, collect_bootstrap_reqs, get_install_args
from pydmt.api.one_source_one_target import OneSourceOneTarget
from pydmt.configs import ConfigVenv
SOURCE_FILE = "config/python.py"
TARGET_FOLDER = ".venv/default"
REQUIREMENTS = "requirements.txt"
[docs]
class BuilderVenv(OneSourceOneTarget):
"""
This is a review of how to build a python virtual environment:
# create the virtualenv
virtualenv [folder]
# activate it
source [folder]/bin/activate
# install package
pip install -r requirements.txt
"""
[docs]
def build(self) -> None:
if ConfigVenv.incremental and os.path.isdir(TARGET_FOLDER):
if os.path.isfile(REQUIREMENTS):
args = get_install_args()
args.extend(["-r", REQUIREMENTS])
check_call_ve(args)
mkdir_touch(self.target)
return
# now install regular packages (we only run the install if there are packages to install)
packs = collect_reqs(add_dev=ConfigVenv.add_dev)
if packs:
args = get_install_args()
args.extend(packs)
check_call_ve(args)
mkdir_touch(self.target)
return
# remove previous virtual env
if os.path.isdir(TARGET_FOLDER):
shutil.rmtree(TARGET_FOLDER)
# create new virtual env
args = [
"virtualenv",
]
if ConfigVenv.system_site_packages:
args.append("--system-site-packages")
args.append(TARGET_FOLDER)
check_call(args)
# upgrade pip if the condig says so
if ConfigVenv.upgrade_pip:
args = [
"pip",
"install",
"--upgrade",
"pip",
]
check_call_ve(args)
if os.path.isfile(REQUIREMENTS):
args = get_install_args()
args.extend(["-r", REQUIREMENTS])
check_call_ve(args)
mkdir_touch(self.target)
return
# install bootstrap packages so that we could read config/* files
packs = collect_bootstrap_reqs()
if packs:
args = get_install_args()
args.extend(packs)
check_call_ve(args)
# now install regular packages (we only run the install if there are packages to install)
packs = collect_reqs(add_dev=ConfigVenv.add_dev)
if packs:
args = get_install_args()
args.extend(packs)
check_call_ve(args)
mkdir_touch(self.target)