コード例 #1
0
ファイル: cli.py プロジェクト: astamminger/aiida-project
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!")
コード例 #2
0
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
コード例 #3
0
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
コード例 #4
0
 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
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
ファイル: conftest.py プロジェクト: astamminger/aiida-project
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()