Ejemplo n.º 1
0
    def test_init_cli_generate_project_fails(self, generate_project_patch,
                                             sd_mock):
        # GIVEN generate_project fails to create a project
        generate_project_patch.side_effect = GenerateProjectFailedError(
            project=self.name, provider_error="Something wrong happened")

        # WHEN generate_project returns an error
        # THEN we should receive a GenerateProjectFailedError Exception
        with self.assertRaises(UserException):
            init_cli(
                self.ctx,
                no_interactive=self.no_interactive,
                location="self.location",
                runtime=self.runtime,
                dependency_manager=self.dependency_manager,
                output_dir=self.output_dir,
                name=self.name,
                app_template=None,
                no_input=self.no_input,
                extra_context=None,
                auto_clone=False,
            )

            generate_project_patch.assert_called_with(self.location,
                                                      self.runtime,
                                                      self.dependency_manager,
                                                      self.output_dir,
                                                      self.name, self.no_input)
Ejemplo n.º 2
0
def generate_project(location=None,
                     runtime="nodejs",
                     output_dir=".",
                     name='sam-sample-app',
                     no_input=False):
    """Generates project using cookiecutter and options given

    Generate project scaffolds a project using default templates if user
    doesn't provide one via location parameter. Default templates are
    automatically chosen depending on runtime given by the user.

    Parameters
    ----------
    location: Path, optional
        Git, HTTP, Local path or Zip containing cookiecutter template
        (the default is None, which means no custom template)
    runtime: str, optional
        Lambda Runtime (the default is "nodejs", which creates a nodejs project)
    output_dir: str, optional
        Output directory where project should be generated
        (the default is ".", which implies current folder)
    name: str, optional
        Name of the project
        (the default is "sam-sample-app", which implies a project named sam-sample-app will be created)
    no_input : bool, optional
        Whether to prompt for input or to accept default values
        (the default is False, which prompts the user for values it doesn't know for baking)

    Raises
    ------
    GenerateProjectFailedError
        If the process of baking a project fails
    """

    params = {
        "template":
        location if location else RUNTIME_TEMPLATE_MAPPING[runtime],
        "output_dir": output_dir,
        "no_input": no_input
    }

    LOG.debug("Parameters dict created with input given")
    LOG.debug("%s", params)

    if not location and name is not None:
        params['extra_context'] = {'project_name': name, 'runtime': runtime}
        params['no_input'] = True
        LOG.debug("Parameters dict updated with project name as extra_context")
        LOG.debug("%s", params)

    try:
        LOG.debug(
            "Baking a new template with cookiecutter with all parameters")
        cookiecutter(**params)
    except CookiecutterException as e:
        raise GenerateProjectFailedError(project=name, provider_error=e)
Ejemplo n.º 3
0
    def test_init_cli_generate_project_fails(self, generate_project_patch):

        # GIVEN generate_project fails to create a project
        generate_project_patch.side_effect = GenerateProjectFailedError(
            project=self.name, provider_error="Something wrong happened")

        # WHEN generate_project returns an error
        # THEN we should receive a GenerateProjectFailedError Exception
        with self.assertRaises(UserException):
            init_cli(self.ctx,
                     location="self.location",
                     runtime=self.runtime,
                     output_dir=self.output_dir,
                     name=self.name,
                     no_input=self.no_input)

            generate_project_patch.assert_called_with(self.location,
                                                      self.runtime,
                                                      self.output_dir,
                                                      self.name, self.no_input)
Ejemplo n.º 4
0
def generate_project(
    location=None, runtime=None, dependency_manager=None, output_dir=".", name=None, no_input=False, extra_context=None
):
    """Generates project using cookiecutter and options given

    Generate project scaffolds a project using default templates if user
    doesn't provide one via location parameter. Default templates are
    automatically chosen depending on runtime given by the user.

    Parameters
    ----------
    location: Path, optional
        Git, HTTP, Local path or Zip containing cookiecutter template
        (the default is None, which means no custom template)
    runtime: str
        Lambda Runtime
    dependency_manager: str, optional
        Dependency Manager for the Lambda Runtime Project
    output_dir: str, optional
        Output directory where project should be generated
        (the default is ".", which implies current folder)
    name: str
        Name of the project
    no_input : bool, optional
        Whether to prompt for input or to accept default values
        (the default is False, which prompts the user for values it doesn't know for baking)

    Raises
    ------
    GenerateProjectFailedError
        If the process of baking a project fails
    """

    template = None

    if runtime:
        for mapping in list(itertools.chain(*(RUNTIME_DEP_TEMPLATE_MAPPING.values()))):
            if runtime in mapping["runtimes"] or any([r.startswith(runtime) for r in mapping["runtimes"]]):
                if not dependency_manager or dependency_manager == mapping["dependency_manager"]:
                    template = mapping["init_location"]
                    break

        if not template:
            msg = "Lambda Runtime {} does not support dependency manager: {}".format(runtime, dependency_manager)
            raise GenerateProjectFailedError(project=name, provider_error=msg)

    params = {"template": location if location else template, "output_dir": output_dir, "no_input": no_input}

    if extra_context:
        params["extra_context"] = extra_context

    LOG.debug("Parameters dict created with input given")
    LOG.debug("%s", params)

    if not location and name is not None:
        params["extra_context"] = {"project_name": name, "runtime": runtime}
        params["no_input"] = True
        LOG.debug("Parameters dict updated with project name as extra_context")
        LOG.debug("%s", params)

    try:
        LOG.debug("Baking a new template with cookiecutter with all parameters")
        cookiecutter(**params)
    except CookiecutterException as e:
        raise GenerateProjectFailedError(project=name, provider_error=e)