Cookiecutter
A command-line utility that creates projects from cookiecutters (project
templates), e.g. creating a Python package project from a Python package project template.
Features
Did someone say features?
Cross-platform: Windows, Mac, and Linux are officially supported.
Works with Python 2.6, 2.7, 3.3, and PyPy. (But you don’t have to know/write Python
code to use Cookiecutter.)
Project templates can be in any programming language or markup format:
Python, JavaScript, Ruby, CoffeeScript, RST, Markdown, CSS, HTML, you name
it. You can use multiple languages in the same project template.
Simple command line usage:
# Create project from the cookiecutter-pypackage.git repo template
# You'll be prompted to enter values.
# Then it'll create your Python package in the current working directory,
# based on those values.
$ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
Can also use it at the command line with a local template:
# Create project in the current working directory, from the local
# cookiecutter-pypackage/ template
$ cookiecutter cookiecutter-pypackage/
Or use it from Python:
from cookiecutter.main import cookiecutter
# Create project from the cookiecutter-pypackage/ template
cookiecutter('cookiecutter-pypackage/')
# Create project from the cookiecutter-pypackage.git repo template
cookiecutter('https://github.com/audreyr/cookiecutter-pypackage.git')
Directory names and filenames can be templated. For example:
{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}.py
Supports unlimited levels of directory nesting.
100% of templating is done with Jinja2. This includes file and directory names.
Simply define your template variables in a cookiecutter.json file. For example:
{
"full_name": "Audrey Roy",
"email": "audreyr@gmail.com",
"project_name": "Complexity",
"repo_name": "complexity",
"project_short_description": "Refreshingly simple static site generator.",
"release_date": "2013-07-10",
"year": "2013",
"version": "0.1.1"
}
Unless you suppress it with –no-input, you are prompted for input:
Prompts are the keys in cookiecutter.json.
Default responses are the values in cookiecutter.json.
Prompts are shown in order.
Cross-platform support for ~/.cookiecutterrc files:
default_context:
full_name: "Audrey Roy"
email: "audreyr@gmail.com"
github_username: "audreyr"
cookiecutters_dir: "~/.cookiecutters/"
Cookiecutters (cloned Cookiecutter project templates) are put into
~/.cookiecutters/ by default, or cookiecutters_dir if specified.
You can use local cookiecutters, or remote cookiecutters directly from Git
repos or from Mercurial repos on Bitbucket.
Default context: specify key/value pairs that you want used as defaults
whenever you generate a project
Pre- and post-generate hooks: Python or shell scripts to run before or after
generating a project.
Paths to local projects can be specified as absolute or relative.
Projects are always generated to your current directory.
Available Cookiecutters
Here is a list of cookiecutters (aka Cookiecutter project templates) for you to use or fork.
Make your own, then submit a pull request adding yours to this list!
Python
cookiecutter-pypackage: @audreyr’s ultimate Python package project
template.
cookiecutter-flask : A Flask template with Bootstrap 3, starter templates, and working user registration.
cookiecutter-simple-django: A cookiecutter template for creating reusable Django projects quickly.
cookiecutter-django: A bleeding edge Django project template with Bootstrap 3, customizable users app, starter templates, and working user registration.
cookiecutter-djangopackage: A template designed to create reusable third-party PyPI friendly Django apps. Documentation is written in tutorial format.
cookiecutter-django-cms: A template for Django CMS with simple Bootstrap 3 template. It has a quick start and deploy documentation.
cookiecutter-openstack: A template for an OpenStack project.
cookiecutter-docopt: A template for a Python command-line script that uses docopt for arguments parsing.
cookiecutter-django-crud: A template to create a Django app with boilerplate CRUD around a model including a factory and tests.
cookiecutter-quokka-module: A template to create a blueprint module for Quokka Flask CMS.
cookiecutter-django-lborgav: Another cookiecutter template for Django project with Booststrap 3 and FontAwesome 4.
cookiecutter-django-paas: Django template ready to use in SAAS platforms like Heroku, OpenShift, etc..
cookiecutter-kivy: A template for NUI applications built upon the kivy python-framework.
cookiecutter-pypackage-minimal: A mimimal Python package template.
cookiecutter-ansible-role: A template to create ansible roles. Forget about file creation and focus on actions.
cookiecutter-pylibrary: An intricate template designed to quickly get started with good testing and packaging (working configuration for Tox, Pytest, Travis-CI, Coveralls, AppVeyor, Sphinx docs, isort, bumpversion, packaging checks etc).
cookiecutter-pylibrary-minimal: Same as above but without Pytest and static configuration for Tox/Travis/AppVeyor (no generator).
Similar projects
Paste has a create option that creates a skeleton project.
Diecutter: an API service that will give you back a configuration file from
a template and variables.
Django’s startproject and startapp commands can take in a –template
option.
python-packager: Creates Python packages from its own template, with
configurable options.
Yeoman has a Rails-inspired generator system that provides scaffolding
for apps.
Pyramid’s pcreate command for creating Pyramid projects from scaffold templates.
mr.bob is a filesystem template renderer, meant to deprecate tools such as
paster and templer.
grunt-init used to be built into Grunt and is now a standalone scaffolding tool
to automate project creation.
scaffolt consumes JSON generators with Handlebars support.
init-skeleton clones or copies a repository, executes npm install and bower install and removes the .git directory.
Cog python-based code generation toolkit developed by Ned Batchelder
History
0.7.2 (2014-08-05)
The goal of this release was to fix cross-platform compatibility, primarily
Windows bugs that had crept in during the addition of new features. As of this
release, Windows is a first-class citizen again, now complete with continuous
integration.
Bug Fixes:
Fixed the contributing file so it displays nicely in Github, thanks to @pydanny.
Updates 2.6 requirements to include simplejson, thanks to @saxix.
Avoid unwanted extra spaces in string literal, thanks to @merwok.
Fix @unittest.skipIf error on Python 2.6.
Let sphinx parse :param: properly by inserting newlines #213, thanks to @mineo.
Fixed Windows test prompt failure by replacing stdin per @cjrh in #195.
Made rmtree remove readonly files, thanks to @pfmoore.
Now using tox to run tests on Appveyor, thanks to @pfmoore (#241).
Fixed tests that assumed the system encoding was utf-8, thanks to @pfmoore (#242, #244).
Added a tox ini file that uses py.test, thanks to @pfmoore (#245).
Other Changes:
@audreyr formally accepted position as BDFL of cookiecutter.
Elevated @pydanny, @michaeljoseph, and @pfmoore to core committer status.
Added Core Committer guide, by @audreyr.
Generated apidocs from make docs, by @audreyr.
Added contributing command to the make docs function, by @pydanny.
Refactored contributing documentation, included adding core committer instructions, by @pydanny and @audreyr.
Do not convert input prompt to bytes, thanks to @uranusjr (#192).
Added troubleshooting info about Python 3.3 tests and tox.
Added documentation about command line arguments, thanks to @saxix.
Style cleanups.
Added environment variable to disable network tests for environments without networking, thanks to @vincentbernat.
Added Appveyor support to aid Windows integrations, thanks to @pydanny (#215).
CONTRIBUTING.rst is now generated via make contributing, thanks to @pydanny (#220).
Removed unnecessary endoing argument to json.load, thanks to @pfmoore (#234).
Now generating shell hooks dynamically for Unix/Windows portability, thanks to @pfmoore (#236).
Removed non-portable assumptions about directory structure, thanks to @pfmoore (#238).
Added a note on portability to the hooks documentation, thanks to @pfmoore (#239).
Replaced unicode_open with direct use of io.open, thanks to @pfmoore (#229).
Added more Cookiecutters to the list:
0.7.1 (2014-04-26)
Bug fixes:
Use the current Python interpreter to run Python hooks, thanks to
@coderanger.
Include tests and documentation in source distribution, thanks to
@vincentbernat.
Fix various warnings and missing things in the docs (#129, #130),
thanks to @nedbat.
Add command line option to get version (#89), thanks to @davedash
and @cyberj.
Other changes:
0.7.0 (2013-11-09)
This is a release with significant improvements and changes. Please read
through this list before you upgrade.
New features:
Support for –checkout argument, thanks to @foobacca.
Support for pre-generate and post-generate hooks, thanks to @raphigaziano.
Hooks are Python or shell scripts that run before and/or after your project
is generated.
Support for absolute paths to cookiecutters, thanks to @krallin.
Support for Mercurial version control system, thanks to @pokoli.
When a cookiecutter contains invalid Jinja2 syntax, you get a better message
that shows the location of the TemplateSyntaxError. Thanks to @benjixx.
Can now prompt the user to enter values during generation from a local
cookiecutter, thanks to @ThomasChiroux. This is now always the default
behavior. Prompts can also be supressed with –no-input.
Your cloned cookiecutters are stored by default in your ~/.cookiecutters/
directory (or Windows equivalent). The location is configurable. (This is a
major change from the pre-0.7.0 behavior, where cloned cookiecutters were
deleted at the end of project generation.) Thanks @raphigaziano.
User config in a ~/.cookiecutterrc file, thanks to @raphigaziano.
Configurable settings are cookiecutters_dir and default_context.
File permissions are now preserved during project generation, thanks to
@benjixx.
Bug fixes:
Unicode issues with prompts and answers are fixed, thanks to @s-m-i-t-a.
The test suite now runs on Windows, which was a major effort. Thanks to
@pydanny, who collaborated on this with me.
Other changes:
Quite a bit of refactoring and API changes.
Lots of documentation improvements. Thanks @sloria, @alex, @pydanny,
@freakboy3742, @es128, @rolo.
Better naming and organization of test suite.
A CookiecutterCleanSystemTestCase to use for unit tests affected by the
user’s config and cookiecutters directory.
Improvements to the project’s Makefile.
Improvements to tests. Thanks @gperetin, @s-m-i-t-a.
Removal of subprocess32 dependency. Now using non-context manager version
of subprocess.Popen for Python 2 compatibility.
Removal of cookiecutter’s cleanup module.
A bit of setup.py cleanup, thanks to @oubiga.
Now depends on binaryornot 0.2.0.
0.6.2 (2013-08-19)
Depend on Jinja2>=2.4 instead of Jinja2==2.7.
Fix errors on attempt to render binary files. Copy them over from the project
template without rendering.
Fix Python 2.6/2.7 UnicodeDecodeError when values containing Unicode chars
are in cookiecutter.json.
Set encoding in Python 3 unicode_open() to always be utf-8.
0.6.1 (2013-08-12)
Improved project template finding. Now looks for the occurrence of {{,
cookiecutter, and }} in a directory name.
Fix help message for input_dir arg at command prompt.
Minor edge cases found and corrected, as a result of improved test coverage.
0.6.0 (2013-08-08)
Config is now in a single cookiecutter.json instead of in json/.
When you create a project from a git repo template, Cookiecutter prompts
you to enter custom values for the fields defined in cookiecutter.json.
0.5 (2013-07-28)
Friendlier, more simplified command line usage:
# Create project from the cookiecutter-pypackage/ template
$ cookiecutter cookiecutter-pypackage/
# Create project from the cookiecutter-pypackage.git repo template
$ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
Can now use Cookiecutter from Python as a package:
from cookiecutter.main import cookiecutter
# Create project from the cookiecutter-pypackage/ template
cookiecutter('cookiecutter-pypackage/')
# Create project from the cookiecutter-pypackage.git repo template
cookiecutter('https://github.com/audreyr/cookiecutter-pypackage.git')
Internal refactor to remove any code that changes the working directory.
0.2 (2013-07-17)
Bumped to “Development Status :: 3 - Alpha”.