Skip to content

Commit

Permalink
Merge pull request #1348 from gavindsouza/virtualenv-shenanigans
Browse files Browse the repository at this point in the history
fix: Virtualenv shenanigans
  • Loading branch information
gavindsouza committed Aug 2, 2022
2 parents ec9d858 + 10473b6 commit a0af073
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 34 deletions.
4 changes: 2 additions & 2 deletions bench/app.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# imports - standard imports
import functools
from functools import lru_cache
import json
import logging
import os
Expand Down Expand Up @@ -149,7 +149,7 @@ def get_ssh_url(self):
return f"git@{self.remote_server}:{self.org}/{self.repo}.git"


@functools.lru_cache(maxsize=None)
@lru_cache(maxsize=None)
class App(AppMeta):
def __init__(
self,
Expand Down
15 changes: 5 additions & 10 deletions bench/bench.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# imports - standard imports
import subprocess
import functools
from functools import lru_cache
import os
import shutil
import json
Expand Down Expand Up @@ -30,7 +30,6 @@
restart_process_manager,
remove_backups_crontab,
get_venv_path,
get_virtualenv_path,
get_env_cmd,
)
from bench.utils.render import job, step
Expand All @@ -55,7 +54,7 @@ def validate_app_uninstall(self, app):
validate_app_installed_on_sites(app, bench_path=self.name)


@functools.lru_cache(maxsize=None)
@lru_cache(maxsize=None)
class Bench(Base, Validator):
def __init__(self, path):
self.name = path
Expand All @@ -71,7 +70,7 @@ def __init__(self, path):

@property
def python(self) -> str:
return get_env_cmd("python", bench_path=self.name)
return get_env_cmd("python*", bench_path=self.name)

@property
def shallow_clone(self) -> bool:
Expand Down Expand Up @@ -347,15 +346,11 @@ def env(self, python="python3"):
click.secho("Setting Up Environment", fg="yellow")

frappe = os.path.join(self.bench.name, "apps", "frappe")
virtualenv = get_virtualenv_path(verbose=verbose)
quiet_flag = "" if verbose else "--quiet"

if not os.path.exists(self.bench.python):
if virtualenv:
self.run(f"{virtualenv} {quiet_flag} env -p {python}", cwd=self.bench.name)
else:
venv = get_venv_path(verbose=verbose, python=python)
self.run(f"{venv} env", cwd=self.bench.name)
venv = get_venv_path(verbose=verbose, python=python)
self.run(f"{venv} env", cwd=self.bench.name)

self.pip()

Expand Down
7 changes: 4 additions & 3 deletions bench/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,13 +190,13 @@ def change_uid():


def app_cmd(bench_path="."):
f = get_env_cmd("python", bench_path=bench_path)
f = get_env_cmd("python*", bench_path=bench_path)
os.chdir(os.path.join(bench_path, "sites"))
os.execv(f, [f] + ["-m", "frappe.utils.bench_helper"] + sys.argv[1:])


def frappe_cmd(bench_path="."):
f = get_env_cmd("python", bench_path=bench_path)
f = get_env_cmd("python*", bench_path=bench_path)
os.chdir(os.path.join(bench_path, "sites"))
os.execv(f, [f] + ["-m", "frappe.utils.bench_helper", "frappe"] + sys.argv[1:])

Expand All @@ -216,7 +216,7 @@ def get_frappe_commands():


def get_frappe_help(bench_path="."):
python = get_env_cmd("python", bench_path=bench_path)
python = get_env_cmd("python*", bench_path=bench_path)
sites_path = os.path.join(bench_path, "sites")
try:
out = get_cmd_output(
Expand Down Expand Up @@ -245,6 +245,7 @@ def setup_clear_cache():

def _chdir(*args, **kwargs):
Bench.cache_clear()
get_env_cmd.cache_clear()
return f(*args, **kwargs)

os.chdir = _chdir
2 changes: 1 addition & 1 deletion bench/commands/make.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,5 +227,5 @@ def pip(ctx, args):

from bench.utils.bench import get_env_cmd

env_py = get_env_cmd("python")
env_py = get_env_cmd("python*")
os.execv(env_py, (env_py, "-m", "pip") + args)
2 changes: 1 addition & 1 deletion bench/commands/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ def setup_backups():
Bench(".").setup.backups()


@click.command("env", help="Setup virtualenv for bench")
@click.command("env", help="Setup Python environment for bench")
@click.option(
"--python", type=str, default="python3", help="Path to Python Executable."
)
Expand Down
12 changes: 4 additions & 8 deletions bench/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,10 +231,10 @@ def run_frappe_cmd(*args, **kwargs):
from bench.utils.bench import get_env_cmd

bench_path = kwargs.get("bench_path", ".")
f = get_env_cmd("python", bench_path=bench_path)
f = get_env_cmd("python*", bench_path=bench_path)
sites_dir = os.path.join(bench_path, "sites")

is_async = False if from_command_line else True
is_async = not from_command_line
if is_async:
stderr = stdout = subprocess.PIPE
else:
Expand All @@ -247,11 +247,7 @@ def run_frappe_cmd(*args, **kwargs):
stderr=stderr,
)

if is_async:
return_code = print_output(p)
else:
return_code = p.wait()

return_code = print_output(p) if is_async else p.wait()
if return_code > 0:
sys.exit(return_code)

Expand Down Expand Up @@ -390,7 +386,7 @@ def generate_command_cache(bench_path=".") -> List:
"""
from bench.utils.bench import get_env_cmd

python = get_env_cmd("python", bench_path=bench_path)
python = get_env_cmd("python*", bench_path=bench_path)
sites_path = os.path.join(bench_path, "sites")

if os.path.exists(bench_cache_file):
Expand Down
23 changes: 15 additions & 8 deletions bench/utils/bench.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import re
import subprocess
import sys
from functools import lru_cache
from glob import glob
from json.decoder import JSONDecodeError

# imports - third party imports
Expand All @@ -19,17 +21,19 @@
logger = logging.getLogger(bench.PROJECT_NAME)


def get_env_cmd(cmd, bench_path="."):
return os.path.abspath(os.path.join(bench_path, "env", "bin", cmd))

@lru_cache(maxsize=None)
def get_env_cmd(cmd: str, bench_path: str = ".") -> str:
# this supports envs' generated by patched virtualenv or venv (which may cause an extra 'local' folder to be created)

def get_virtualenv_path(verbose=False):
virtualenv_path = which("virtualenv")
existing_python_bins = glob(
os.path.join(bench_path, "env", "**", "bin", cmd), recursive=True
)

if not virtualenv_path and verbose:
log("virtualenv cannot be found", level=2)
if existing_python_bins:
return os.path.abspath(existing_python_bins[0])

return virtualenv_path
cmd = cmd.strip("*")
return os.path.abspath(os.path.join(bench_path, "env", "bin", cmd))


def get_venv_path(verbose=False, python="python3"):
Expand Down Expand Up @@ -172,6 +176,9 @@ def migrate_env(python, backup=False):
path = os.getcwd()
python = which(python)
virtualenv = which("virtualenv")
if not virtualenv:
raise FileNotFoundError("`virtualenv` not found. Install it and try again.")

pvenv = os.path.join(path, nvenv)

# Clear Cache before Bench Dies.
Expand Down
2 changes: 1 addition & 1 deletion docs/bench_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ The setup commands used for setting up the Frappe environment in context of the
- **sudoers**: Add commands to sudoers list for allowing bench commands execution without root password
- **env**: Setup virtualenv for bench. This sets up a `env` folder under the root of the bench directory.
- **env**: Setup Python virtual environment for bench. This sets up a `env` folder under the root of the bench directory.
- **redis**: Generates configuration for Redis
- **fonts**: Add Frappe fonts to system
- **config**: Generate or over-write sites/common_site_config.json
Expand Down

0 comments on commit a0af073

Please sign in to comment.