Exemple #1
0
 def test_find_template(self):
     template = find.find_template(repo_dir='tests/fake-repo-pre2')
     self.assertEqual(template,
                      'tests/fake-repo-pre2/{{cookiecutter.repo_name}}')
     self.assertNotEqual(
         template, 'tests/fake-repo-pre2/{{cookiecutter.repo_name }}')
     self.assertNotEqual(
         template, 'tests/fake-repo-pre2/{{ cookiecutter.repo_name }}')
 def test_find_template(self):
     template = find.find_template(repo_dir='tests/fake-repo-pre2'.replace("/", os.sep))
     test_dir = 'tests/fake-repo-pre2/{{cookiecutter.repo_name}}'.replace("/", os.sep)
     self.assertEqual(template, test_dir)
     test_dir = 'tests/fake-repo-pre2/{{cookiecutter.repo_name }}'.replace("/", os.sep)
     self.assertNotEqual(template, test_dir)
     test_dir = 'tests/fake-repo-pre2/{{ cookiecutter.repo_name }}'.replace("/", os.sep)
     self.assertNotEqual(template, test_dir)
Exemple #3
0
def recut():
    """
    Recreate setup.py so that we can edit keywords
    Remove unnecessary code examples
    """
    # template location
    try:
        # cutting cookie from directory with template
        temp_dir = find.find_template('..')
    except NonTemplatedInputDirException as e:
        # template coming from Github
        # Hooks are passed through jinja2. raw will
        # Make sure `cookiecutter.project` isn't replaced
        {% raw %}
        temp_dir = os.path.join(config['cookiecutters_dir'],
                                'cookiecutter-ckan-extension',
                                '{{cookiecutter.project}}')
        {% endraw %}

    # Location for resulting file
    destination = os.getcwd()
    # name of template
    setup_template = 'setup.py'

    # get context
    context = {{ cookiecutter | jsonify }}

    # Process keywords
    keywords = context['keywords'].strip().split()
    keywords = [keyword for keyword in keywords
                if keyword not in ('ckan', 'CKAN', 'A', 'space',
                                   'seperated', 'list', 'of', 'keywords')]
    keywords.insert(0, 'CKAN')
    keywords = u' '.join(keywords)
    context['keywords'] = keywords

    # Double check 'project_shortname' and 'plugin_class_name'
    short_name = context['project'][8:].replace('-','_')
    if context['project_shortname'] != short_name:
        context['project_shortname'] = short_name

    plugin_class_name = '{}Plugin'.format(context['project_shortname']
                        .title().replace('_', ''))
    if context['plugin_class_name'] != plugin_class_name:
        context['plugin_class_name'] = plugin_class_name
    # Recut cookie
    env = StrictEnvironment()
    env.loader = jinja2.FileSystemLoader(temp_dir)
    gen.generate_file(project_dir=destination,
                      infile=setup_template,
                      context={'cookiecutter': context},
                      env=env)
    if not asbool(context['include_examples']):
        remove_code_examples(os.path.join(destination, 'ckanext', short_name))
Exemple #4
0
 def test_find_template(self):
     template = find.find_template(
         repo_dir='tests/fake-repo-pre2'.replace("/", os.sep))
     test_dir = 'tests/fake-repo-pre2/{{cookiecutter.repo_name}}'.replace(
         "/", os.sep)
     self.assertEqual(template, test_dir)
     test_dir = 'tests/fake-repo-pre2/{{cookiecutter.repo_name }}'.replace(
         "/", os.sep)
     self.assertNotEqual(template, test_dir)
     test_dir = 'tests/fake-repo-pre2/{{ cookiecutter.repo_name }}'.replace(
         "/", os.sep)
     self.assertNotEqual(template, test_dir)
Exemple #5
0
def emit_cookiecutter_sources(target, source, env):
    """Emit the full list of sources for a Cookiecutter project, based on
    the root ``cookiecutter.json`` source.

    This is a **Scons emitter** that is used with the
    `cookiecutter_project_builder` to establish a project template's full
    source list.
    """
    # Get the template directory (i.e., "{{ cookiecutter.project_name }}/")
    template_dir = find_template('.')
    # Get all the template files and add them to the sources
    for (_base_path, _dir_names, _file_names) in os.walk(template_dir):
        source.extend(
            [os.path.join(_base_path, file_name) for file_name in _file_names])
    return target, source
Exemple #6
0
def generate_files(
    repo_dir,
    context=None,
    output_dir='.',
    overwrite_if_exists=False,
    skip_if_file_exists=False,
    context_key=None,
    accept_hooks=True,
):
    """Render the templates and saves them to files.

    :param repo_dir: Project template input directory.
    :param context: Dict for populating the template's variables.
    :param output_dir: Where to output the generated project dir into.
    :param overwrite_if_exists: Overwrite the contents of the output directory
        if it exists.
    :param accept_hooks: Accept pre and post hooks if set to `True`.
    """
    if not context_key:
        context_key = next(iter(context))

    template_dir = find_template(repo_dir, context_key)
    if template_dir:
        envvars = context.get(context_key, {}).get('_jinja2_env_vars', {})

        unrendered_dir = os.path.split(template_dir)[1]
        ensure_dir_is_templated(unrendered_dir)
        env = StrictEnvironment(context=context,
                                keep_trailing_newline=True,
                                **envvars)
        try:
            project_dir, output_directory_created = render_and_create_dir(
                unrendered_dir, context, output_dir, env, overwrite_if_exists)
        except UndefinedError as err:
            msg = "Unable to create project directory '{}'".format(
                unrendered_dir)
            raise UndefinedVariableInTemplate(msg, err, context)

        # We want the Jinja path and the OS paths to match. Consequently, we'll:
        #   + CD to the template folder
        #   + Set Jinja's path to '.'
        #
        #  In order to build our files to the correct folder(s), we'll use an
        # absolute path for the target folder (project_dir)

        project_dir = os.path.abspath(project_dir)
        logger.debug('Project directory is %s', project_dir)

        # if we created the output directory, then it's ok to remove it
        # if rendering fails
        delete_project_on_failure = output_directory_created

        if accept_hooks:
            _run_hook_from_repo_dir(
                repo_dir,
                'pre_gen_project',
                project_dir,
                context,
                delete_project_on_failure,
            )

        with work_in(template_dir):
            env.loader = FileSystemLoader('.')

            for root, dirs, files in os.walk('.'):
                # We must separate the two types of dirs into different lists.
                # The reason is that we don't want ``os.walk`` to go through the
                # unrendered directories, since they will just be copied.
                copy_dirs = []
                render_dirs = []

                for d in dirs:
                    d_ = os.path.normpath(os.path.join(root, d))
                    # We check the full path, because that's how it can be
                    # specified in the ``_copy_without_render`` setting, but
                    # we store just the dir name
                    if is_copy_only_path(d_, context):
                        copy_dirs.append(d)
                    else:
                        render_dirs.append(d)

                for copy_dir in copy_dirs:
                    indir = os.path.normpath(os.path.join(root, copy_dir))
                    outdir = os.path.normpath(os.path.join(project_dir, indir))
                    outdir = env.from_string(outdir).render(**context)
                    logger.debug('Copying dir %s to %s without rendering',
                                 indir, outdir)
                    shutil.copytree(indir, outdir)

                # We mutate ``dirs``, because we only want to go through these dirs
                # recursively
                dirs[:] = render_dirs
                for d in dirs:
                    unrendered_dir = os.path.join(project_dir, root, d)
                    try:
                        render_and_create_dir(
                            unrendered_dir,
                            context,
                            output_dir,
                            env,
                            overwrite_if_exists,
                        )
                    except UndefinedError as err:
                        if delete_project_on_failure:
                            rmtree(project_dir)
                        _dir = os.path.relpath(unrendered_dir, output_dir)
                        msg = "Unable to create directory '{}'".format(_dir)
                        raise UndefinedVariableInTemplate(msg, err, context)

                for f in files:
                    infile = os.path.normpath(os.path.join(root, f))
                    if is_copy_only_path(infile, context):
                        outfile_tmpl = env.from_string(infile)
                        outfile_rendered = outfile_tmpl.render(**context)
                        outfile = os.path.join(project_dir, outfile_rendered)
                        logger.debug('Copying file %s to %s without rendering',
                                     infile, outfile)
                        shutil.copyfile(infile, outfile)
                        shutil.copymode(infile, outfile)
                        continue
                    try:
                        generate_file(
                            project_dir,
                            infile,
                            context,
                            env,
                            skip_if_file_exists,
                            context_key,
                        )
                    except UndefinedError as err:
                        if delete_project_on_failure:
                            rmtree(project_dir)
                        msg = "Unable to create file '{}'".format(infile)
                        raise UndefinedVariableInTemplate(msg, err, context)

        if accept_hooks:
            _run_hook_from_repo_dir(
                repo_dir,
                'post_gen_project',
                project_dir,
                context,
                delete_project_on_failure,
            )

            for o in post_gen_operator_list:
                o.execute()

            return project_dir
    else:
        if accept_hooks:
            _run_hook_from_repo_dir(
                repo_dir,
                'post_gen_project',
                '.',  # TODO: This needs context switching
                context,
                False,
            )

        for o in post_gen_operator_list:
            o.execute()
        return None
Exemple #7
0
def test_find_template(repo_dir):
    env = environment.StrictEnvironment()
    template = find.find_template(repo_dir=repo_dir, env=env)

    test_dir = os.path.join(repo_dir, '{{cookiecutter.repo_name}}')
    assert template == test_dir
Exemple #8
0
def test_find_template(repo_dir):
    template = find.find_template(repo_dir=repo_dir)

    test_dir = os.path.join(repo_dir, '{{cookiecutter.repo_name}}')
    assert template == test_dir
Exemple #9
0
def test_find_template(repo_dir):
    """Verify correctness of `find.find_template` path detection."""
    template = find.find_template(repo_dir=repo_dir)

    test_dir = os.path.join(repo_dir, '{{cookiecutter.repo_name}}')
    assert template == test_dir
Exemple #10
0
def test_find_template(repo_dir):
    template = find.find_template(repo_dir=repo_dir)

    test_dir = os.path.join(repo_dir, '{{cookiecutter.repo_name}}')
    assert template == test_dir
Exemple #11
0
def generate_files(repo_dir,
                   context=None,
                   output_dir=".",
                   overwrite_if_exists=False):
    """Render the templates and saves them to files.

    :param repo_dir: Project template input directory.
    :param context: Dict for populating the template's variables.
    :param output_dir: Where to output the generated project dir into.
    :param overwrite_if_exists: Overwrite the contents of the output directory
        if it exists.
    """
    template_dir = find_template(repo_dir)
    logger.debug("Generating project from {}...".format(template_dir))
    context = context or OrderedDict([])

    unrendered_dir = os.path.split(template_dir)[1]
    ensure_dir_is_templated(unrendered_dir)
    env = StrictEnvironment(
        context=context,
        keep_trailing_newline=True,
    )
    try:
        project_dir, output_directory_created = render_and_create_dir(
            unrendered_dir, context, output_dir, env, overwrite_if_exists)
    except UndefinedError as err:
        msg = "Unable to create project directory '{}'".format(unrendered_dir)
        raise UndefinedVariableInTemplate(msg, err, context)

    # We want the Jinja path and the OS paths to match. Consequently, we'll:
    #   + CD to the template folder
    #   + Set Jinja's path to '.'
    #
    #  In order to build our files to the correct folder(s), we'll use an
    # absolute path for the target folder (project_dir)

    project_dir = os.path.abspath(project_dir)
    logger.debug("Project directory is {}".format(project_dir))

    # if we created the output directory, then it's ok to remove it
    # if rendering fails
    delete_project_on_failure = output_directory_created

    _run_hook_from_repo_dir(
        repo_dir,
        "pre_gen_project",
        project_dir,
        context,
        delete_project_on_failure,
    )

    with work_in(template_dir):
        env.loader = FileSystemLoader(".")

        for root, dirs, files in os.walk("."):
            # We must separate the two types of dirs into different lists.
            # The reason is that we don't want ``os.walk`` to go through the
            # unrendered directories, since they will just be copied.
            copy_dirs = []
            render_dirs = []

            for d in dirs:
                d_ = os.path.normpath(os.path.join(root, d))
                # We check the full path, because that's how it can be
                # specified in the ``_copy_without_render`` setting, but
                # we store just the dir name
                if is_copy_only_path(d_, context):
                    copy_dirs.append(d)
                else:
                    render_dirs.append(d)

            for copy_dir in copy_dirs:
                indir = os.path.normpath(os.path.join(root, copy_dir))
                outdir = os.path.normpath(os.path.join(project_dir, indir))
                logger.debug("Copying dir {} to {} without rendering"
                             "".format(indir, outdir))
                shutil.copytree(indir, outdir)

            # We mutate ``dirs``, because we only want to go through these dirs
            # recursively
            dirs[:] = render_dirs
            for d in dirs:
                unrendered_dir = os.path.join(project_dir, root, d)
                try:
                    render_and_create_dir(
                        unrendered_dir,
                        context,
                        output_dir,
                        env,
                        overwrite_if_exists,
                    )
                except UndefinedError as err:
                    if delete_project_on_failure:
                        rmtree(project_dir)
                    _dir = os.path.relpath(unrendered_dir, output_dir)
                    msg = "Unable to create directory '{}'".format(_dir)
                    raise UndefinedVariableInTemplate(msg, err, context)

            for f in files:
                infile = os.path.normpath(os.path.join(root, f))
                if is_copy_only_path(infile, context):
                    outfile_tmpl = env.from_string(infile)
                    outfile_rendered = outfile_tmpl.render(**context)
                    outfile = os.path.join(project_dir, outfile_rendered)
                    logger.debug("Copying file {} to {} without rendering"
                                 "".format(infile, outfile))
                    shutil.copyfile(infile, outfile)
                    shutil.copymode(infile, outfile)
                    continue
                try:
                    generate_file(project_dir, infile, context, env)
                except UndefinedError as err:
                    if delete_project_on_failure:
                        rmtree(project_dir)
                    msg = "Unable to create file '{}'".format(infile)
                    raise UndefinedVariableInTemplate(msg, err, context)

    _run_hook_from_repo_dir(
        repo_dir,
        "post_gen_project",
        project_dir,
        context,
        delete_project_on_failure,
    )

    return project_dir