import argparse
import json
import os
import requests
import sys
import materials_commons.api as mcapi
import materials_commons.cli.functions as clifuncs
from materials_commons.cli.exceptions import MCCLIException
[docs]
def init_project(name, description="", prefix=None, remote_config=None):
    """Initialize directory prefix/name as a new project
    Arguments
    ---------
    name: str, Project name. If prefix/name does not exist it will be created.
    description: str, Project description.
    prefix: str, The project directory will be created at prefix/name.
    remote_config: RemoteConfig, The remote where the project will be created.
    Returns
    -------
    proj: mcapi.Project
    Raises
    ------
    MCCLIException: If any of the following occur:
        - prefix does not exist
        - prefix/name is a file
        - prefix/name/.mc already exists
    """
    if prefix is None:
        prefix = os.getcwd()
    if not os.path.exists(prefix):
        raise MCCLIException("Error in init_project: '" + prefix + "' does not exist.")
    proj_path = os.path.join(prefix, name)
    if os.path.isfile(proj_path):
        raise MCCLIException("Error in init_project: '" + proj_path + "' is a file.")
    if os.path.exists(os.path.join(proj_path, ".mc")):
        pconfig = clifuncs.read_project_config(proj_path)
        # if .mc directory already exists, print error message
        if pconfig:
            try:
                proj = clifuncs.make_local_project(proj_path)
            except MCCLIException as e:
                # print(e)
                s = "A .mc directory already exists, but could not find existing project.\n"
                s += "This may mean the project was deleted.\n"
                s += "If you wish to create a new project here, first delete the .mc directory.\n"
                raise MCCLIException(s)
            raise MCCLIException("Already in project.  name: " + proj.name + "   id: " + str(proj.id))
    else:
        if not os.path.exists(proj_path):
            os.mkdir(proj_path)
    # create new project
    client = remote_config.make_client()
    try:
        proj_request = mcapi.CreateProjectRequest(description=description)
        proj = client.create_project(name, attrs=proj_request)
    except requests.exceptions.ConnectionError as e:
        print(e)
        raise MCCLIException("Could not connect to " + remote_config.mcurl)
    proj.local_path = proj_path
    proj.remote = client
    # create project config directory and file
    pconfig = clifuncs.ProjectConfig(proj.local_path)
    pconfig.remote = remote_config
    pconfig.project_id = proj.id
    pconfig.project_uuid = proj.uuid
    pconfig.save()
    return proj 
[docs]
def make_parser():
    """Make argparse.ArgumentParser for `mc init`"""
    parser = argparse.ArgumentParser(
        description='Initialize current working directory as a new project',
        prog='mc init')
    clifuncs.add_remote_option(parser, 'Remote to create project at')
    parser.add_argument('--desc', type=str, default='', help='Project description')
    return parser 
[docs]
def init_subcommand(argv, working_dir):
    """
    Initialize a new project
    mc init [--remote <remote>] [--desc <description>]
    """
    parser = make_parser()
    args = parser.parse_args(argv)
    # get remote, from command line option or default
    remote_config = clifuncs.optional_remote_config(args)
    proj_path = working_dir
    name = os.path.basename(proj_path)
    prefix = os.path.dirname(proj_path)
    proj = init_project(name, args.desc, prefix=prefix, remote_config=remote_config)
    print("Created new project on:", remote_config.mcurl)
    clifuncs.print_projects([proj], proj)
    print("")