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)
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))
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)
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
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
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
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
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
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