Source code for cookiecutter.generate

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
cookiecutter.generate
---------------------

Functions for generating a project from a project template.
"""

import logging
import os
import sys

from jinja2 import FileSystemLoader, Template
from jinja2.environment import Environment

from .exceptions import NonTemplatedInputDirException
from .utils import make_sure_path_exists, unicode_open


if sys.version_info[:2] < (2, 7):
    import simplejson as json
    from ordereddict import OrderedDict
else:
    import json
    from collections import OrderedDict

[docs]def generate_context(config_file='cookiecutter.json'): """ Generates the context for a Cookiecutter project template. Loads the JSON file as a Python object, with key being the JSON filename. :param config_file: JSON file containing project config values. :paramtype config_file: filename """ context = {} file_handle = open(config_file) obj = json.load(file_handle, object_pairs_hook=OrderedDict) # Add the Python object to the context dictionary file_name = os.path.split(config_file)[1] file_stem = file_name.split('.')[0] context[file_stem] = obj logging.debug('Context generated is {0}'.format(context)) return context
[docs]def generate_files(template_dir, context=None): """ Renders the templates and saves them to files. :param input_dir: Project template input directory. :paramtype input_dir: directory """ logging.debug('Generating project from {0}...'.format(template_dir)) context = context or {} env = Environment() env.loader = FileSystemLoader('.') # Render dirname before writing name_tmpl = Template(template_dir) output_dir = name_tmpl.render(**context) if output_dir == template_dir: raise NonTemplatedInputDirException make_sure_path_exists(output_dir) for root, dirs, files in os.walk(template_dir): for d in dirs: indir = os.path.join(root, d) outdir = indir.replace(template_dir, output_dir, 1) # Render dirname before writing name_tmpl = Template(outdir) rendered_dirname = name_tmpl.render(**context) make_sure_path_exists(rendered_dirname) for f in files: # Render the file infile = os.path.join(root, f) tmpl = env.get_template(infile) rendered_file = tmpl.render(**context) # Write it to the corresponding place in output_dir outfile = infile.replace(template_dir, output_dir, 1) # Render the output filename before writing name_tmpl = Template(outfile) rendered_name = name_tmpl.render(**context) logging.debug("Writing {0}".format(rendered_name)) with unicode_open(rendered_name, 'w') as fh: fh.write(rendered_file)