def remove(project_name): """ Remove an existing AiiDA project environment. Deletes the environment folder and removes the AiiDA project from the list of managed environments. Warning: This action will **permanently** delete all data contained in the project folder including databases, repositories and configs. """ # check if the project exists before we go any further if not utils.project_name_exists(project_name): raise Exception("unable to delete project '{}' because it does not " "exist") print("\nWARNING: You are about to delete the AiiDA project '{}'".format( project_name)) print("\nTHIS WILL DELETE THE PROJECT AND ALL OF ITS CONTENTS!\n") # make it double to be sure. annoying? YES! But I learned my lessons # from using rm -rf or dd :P delete = click.confirm("Do you really want to proceed?") if delete: delete_really = click.confirm("This is your last chance, really?") if delete and delete_really: project_spec = utils.load_project_spec()[project_name] project_path = project_spec['project_path'] # TODO: add the actual deletion else: print("Project not deleted!")
def test_create_project_environment_success(temporary_folder, temporary_home, fake_popen): """Test full cycle for creating an environment from conda.""" fake_popen.set_cmd_attrs('virtualenv --version', returncode=0) fake_popen.set_cmd_attrs('git --version', returncode=0) # make sure we write to the correct directory assert pathlib.Path.home() == temporary_folder arguments = { 'proj_name': 'venv_project', 'proj_path': pathlib.Path(temporary_folder), 'python_version': '0.0', 'aiida_version': '0.0.0', 'packages': [ 'aiida-vasp[extras1]', 'pymatgen==2019.3.13', 'aiidateam/aiida-ase:devel[extras1]' ] } creator = CreateEnvVirtualenv(**arguments) fake_popen.set_cmd_attrs('virtualenv', returncode=0) creator.create_aiida_project_environment() base_folder = str((creator.env_folder / creator.proj_name).absolute()) src_folder = creator.src_folder.absolute() expected_cmd_order = [ "virtualenv --version", "git --version", # !!! There are 2 empty spaces expected after virtualenv due to the # !!! empty env_arguments list "virtualenv --python=python0.0 {}".format(base_folder), ("pip install --pre aiida-core==0.0.0 aiida-vasp[extras1] " "pymatgen==2019.3.13"), ("git clone --single-branch --branch devel https://github.com/" "aiidateam/aiida-ase {}".format(str(src_folder / "aiida-ase"))), ("pip install --editable {}".format( str(src_folder / "aiida-ase[extras1]"))) ] # compare expected cmd order with actual cmd order send to Popen actual_cmd_order = [_ for (_, ) in fake_popen.args] assert actual_cmd_order == expected_cmd_order # test the written project specs path_to_config = (pathlib.Path.home() / constants.CONFIG_FOLDER / constants.PROJECTS_FILE) assert path_to_config.exists() is True loaded_specs = utils.load_project_spec() assert 'venv_project' in loaded_specs.keys() contents = loaded_specs['venv_project'] ppath = pathlib.Path(temporary_folder) srcpath = ppath / 'venv_project' / constants.DEFAULT_SRC_SUBFOLDER envpath = ppath / 'venv_project' / constants.DEFAULT_ENV_SUBFOLDER assert contents['project_path'] == str(ppath) assert contents['aiida'] == '0.0.0' assert contents['python'] == '0.0' assert contents['env_sub'] == str(envpath) assert contents['src_sub'] == str(srcpath) assert contents['manager'] == constants.MANAGER_NAME_VENV
def test_save_and_load_project_spec(temporary_home): """Test that the project spec is written and loaded correctly.""" project_name_a = 'testproject_a' project_spec_a = { 'project_name': project_name_a, 'project_path': '/this/is/some/random/path', 'aiida': '12.2323.23982', 'python': '28932.28392', 'env_sub': 'the_env_subfolder', 'src_sub': 'the_src_subfolder', 'manager': 'manager_name', } project_name_b = 'testproject_b' project_spec_b = { 'project_name': project_name_b, 'project_path': '/this/is/some/random/path', 'aiida': '12.2323.23982', 'python': '28932.28392', 'env_sub': 'the_env_subfolder', 'src_sub': 'the_src_subfolder', 'manager': 'manager_name', } path_to_config = (pathlib.Path.home() / constants.CONFIG_FOLDER / constants.PROJECTS_FILE) # check that there is no file already assert path_to_config.exists() is False # write specs to file utils.save_project_spec(project_spec_a) assert path_to_config.exists() is True # load specs from file loaded_spec_a = utils.load_project_spec() assert project_name_a in loaded_spec_a.keys() # save_project_spec has already popped the 'project_name' key so we # can compare the contents immediately assert loaded_spec_a[project_name_a] == project_spec_a # write the second spec to the file utils.save_project_spec(project_spec_b) # and load it back loaded_spec_b = utils.load_project_spec() assert project_name_a in loaded_spec_b.keys() assert project_name_b in loaded_spec_b.keys() # save_project_spec has already popped the 'project_name' key so we # can compare the contents immediately assert loaded_spec_b[project_name_a] == project_spec_a assert loaded_spec_b[project_name_b] == project_spec_b
def load_project_spec(self, project_name): """Load the specifications for the given project.""" project_specs = utils.load_project_spec() try: project_spec = project_specs[project_name] except KeyError: raise Exception("Unable to complete activation. Project '{}' " "does not exists.".format(project_name)) return project_spec
def test_create_project_environment_success(temporary_folder, temporary_home, fake_popen): """Test full cycle for creating an environment from conda.""" # setup Popen fake_popen.set_cmd_attrs('conda --version', returncode=0) fake_popen.set_cmd_attrs('git --version', returncode=0) # make sure we write to the correct directory assert pathlib.Path.home() == temporary_folder arguments = { 'proj_name': 'conda_project', 'proj_path': pathlib.Path(temporary_folder), 'python_version': '0.0', 'aiida_version': '0.0.0', 'packages': ['aiida-core.services', 'pymatgen=2019.3.13'], } creator = CreateEnvConda(**arguments) fake_popen.set_cmd_attrs('conda', returncode=0) creator.create_aiida_project_environment() base_folder = str((creator.env_folder / creator.proj_name).absolute()) expected_cmd_order = [ "conda --version", "conda create --yes --prefix {} python=0.0".format(base_folder), ("conda install --yes --channel conda-forge --channel bioconda " "--channel matsci --prefix {} aiida-core=0.0.0 aiida-core.services " "pymatgen=2019.3.13".format(base_folder)), ] # compare expected cmd order with actual cmd order send to Popen actual_cmd_order = [_ for (_, ) in fake_popen.args] assert actual_cmd_order == expected_cmd_order # test the written project specs path_to_config = (pathlib.Path.home() / constants.CONFIG_FOLDER / constants.PROJECTS_FILE) assert path_to_config.exists() is True loaded_specs = utils.load_project_spec() assert 'conda_project' in loaded_specs.keys() contents = loaded_specs['conda_project'] ppath = pathlib.Path(temporary_folder) srcpath = ppath / 'conda_project' / constants.DEFAULT_SRC_SUBFOLDER envpath = ppath / 'conda_project' / constants.DEFAULT_ENV_SUBFOLDER assert contents['project_path'] == str(ppath) assert contents['aiida'] == '0.0.0' assert contents['python'] == '0.0' assert contents['env_sub'] == str(envpath) assert contents['src_sub'] == str(srcpath) assert contents['manager'] == constants.MANAGER_NAME_CONDA
def test_project_name_exists(temporary_home): """Test the function checking for duplicate project names.""" project_name = 'test_project' project_spec = { 'project_name': project_name, 'project_path': '', 'aiida': '', 'python': '', 'env_sub': '', 'src_sub': '', 'manager': '', } # save and check that the project is there utils.save_project_spec(project_spec) loaded_contents = utils.load_project_spec() assert project_name in loaded_contents.keys() result = utils.project_name_exists('test_project') assert result is True result = utils.project_name_exists('test_project_new') assert result is False
def project_spec_file(temporary_home): home = pathlib.Path.home() venv_env = { 'project_name': 'virtualenv_project', 'project_path': str(home / 'virtualenv_project'), 'aiida': '1.0.0', 'python': '3.6', 'env_sub': str(home / 'virtualenv_project' / 'env'), 'src_sub': str(home / 'virtualenv_project' / 'src'), 'manager': constants.MANAGER_NAME_VENV, } conda_env = { 'project_name': 'conda_project', 'project_path': str(home / 'conda_project'), 'aiida': '1.0.0', 'python': '3.6', 'env_sub': str(home / 'conda_project' / 'env'), 'src_sub': str(home / 'conda_project' / 'src'), 'manager': constants.MANAGER_NAME_CONDA, } utils.save_project_spec(venv_env) utils.save_project_spec(conda_env) yield utils.load_project_spec()