Source code for refyre.core.RecipePreprocessor
from pathlib import Path
import sys
import venv
import site
from refyre.utils import optional_dependencies
from refyre import Refyre
from refyre.config import logger
from pip._internal import main as pip_main
import subprocess
import shutil
import os
[docs]
def create_virtualenv_and_install_requirements(directory, requirements_file):
"""
Create a virtual environment in the specified directory using venv.Builder.
Args:
directory (str): The directory path where the virtual environment will be created.
"""
# Create the directory if it doesn't exist
Path(directory).mkdir(parents=True, exist_ok=True)
# Set up the builder
builder = venv.EnvBuilder(with_pip=True)
# Create the virtual environment
builder.create(directory)
[docs]
class RecipePreprocessor:
def __new__(self, recipe_path):
'''
Performs all the recipe path preprocessing, and then
returns the Refyre instance
to manage.
Returns the refyre instance
'''
with optional_dependencies("warn"):
import yaml
assert Path(recipe_path).exists(), f"The input file you were trying to access - {recipe_path} - does NOT exist"
recipe_dict = None
with open(recipe_path, 'r') as f:
recipe_dict = yaml.safe_load(f)
logger.debug(recipe_dict)
'''
Currently, a recipe consists of attributes:
input-spec: a filepath to the input spec
base-dir: filepath to the base directory / entry point you want your program to see
env: a description of the environment you want to setup, with two attributes
- name: name of the environment
- requirements: requirements file
'''
logger.debug(recipe_dict)
logger.debug(recipe_dict['env']['name'])
#Setup the base directories based on an input spec
logger.debug(f'Sending to: {recipe_dict["input-spec"]}')
#Current base directory is assumed to be CWD
'''
if 'base-dir' and Path(recipe_dict['base-dir']) != Path.cwd():
current_base_dir = Path.cwd()
logger.debug(f'{sys.path}, {current_base_dir.resolve()}')
sys.path.remove(str(current_base_dir.resolve()))
sys.path.append(str(Path(recipe_dict['base-dir'].resolve())))
logger.debug()
'''
ref = Refyre.Refyre(input_specs = [recipe_dict["input-spec"]])
#Create the env if it doesn't exist already or needs to be refreshed
venv_path = recipe_dict['env']['name']
if 'env' in recipe_dict and recipe_dict['env']:
if 'name' in recipe_dict['env']:
if not Path(recipe_dict['env']['name']).exists():
create_virtualenv_and_install_requirements(venv_path, recipe_dict['env']['requirements'])
elif 'refresh' in recipe_dict['env'] and recipe_dict['env']['refresh']:
shutil.rmtree(recipe_dict['env']['name'])
create_virtualenv_and_install_requirements(recipe_dict['env']['name'], recipe_dict['env']['requirements'])
return ref