Cookiecutter Readthedocs Io en 1.7.2
Cookiecutter Readthedocs Io en 1.7.2
Release 1.7.2
1 Basics 3
1.1 Cookiecutter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5 Learn the Basics of Cookiecutter by Creating a Cookiecutter . . . . . . . . . . . . . . . . . . . . . . 12
1.6 Additional Tutorials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.7 Getting to Know Cookiecutter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.8 Create a Cookiecutter From Scratch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.9 Advanced Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.10 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2 API Reference 29
2.1 cookiecutter package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3 Project Info 41
3.1 Contributing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2 Credits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3 Sprint Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.4 History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.5 Case Studies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6 Backers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.7 Code of Conduct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4 Index 73
Index 77
i
ii
cookiecutter Documentation, Release 1.7.2
Cookiecutter creates projects from project templates, e.g. Python package projects.
Contents 1
cookiecutter Documentation, Release 1.7.2
2 Contents
CHAPTER 1
Basics
1.1 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.
• Documentation: https://cookiecutter.readthedocs.io
• GitHub: https://github.com/cookiecutter/cookiecutter
• PyPI: https://pypi.python.org/pypi/cookiecutter
• Free and open source software: BSD license
1.1.1 Features
3
cookiecutter Documentation, Release 1.7.2
{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}.py
{
"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/"
4 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
• Cookiecutters (cloned Cookiecutter project templates) are put into ~/.cookiecutters/ by default, or cook-
iecutters_dir if specified.
• If you have already cloned a cookiecutter into ~/.cookiecutters/, you can reference it by directory name:
# Clone cookiecutter-pypackage
$ cookiecutter gh:audreyr/cookiecutter-pypackage
# Now you can use the already cloned cookiecutter by name
$ cookiecutter cookiecutter-pypackage
• 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.
• Inject extra context with command-line arguments:
• Direct access to the Cookiecutter API allows for injection of extra context.
• 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 generated to your current directory or to target directory if specified with -o option.
Making great cookies takes a lot of cookiecutters and contributors. We’re so pleased that there are many Cookiecutter
project templates to choose from. We hope you find a cookiecutter that is just right for your needs.
The best place to start searching for specific and ready to use cookiecutter template is Github search. Just type
cookiecutter and you will discover over 4000 related repositories.
We also recommend you to check related GitHub topics. For general search use cookiecutter-
template. For specific topics try to use cookiecutter-yourtopic, like cookiecutter-python or
cookiecutter-datascience. This is new GitHub feature, so not all active repositories use it at the moment.
If you are template developer please add related topics with cookiecutter prefix to you repository. We believe it
will make it more discoverable. You are almost not limited in topics amount, use it!
1.1. Cookiecutter 5
cookiecutter Documentation, Release 1.7.2
1.1.5 Community
The core committer team can be found in authors section. We are always welcome and invite you to participate.
Stuck? Try one of the following:
• See the Troubleshooting page.
• Ask for help on Stack Overflow.
• You are strongly encouraged to file an issue about the problem, even if it’s just “I can’t get it to work on this
cookiecutter” with a link to your cookiecutter. Don’t worry about naming/pinpointing the issue properly.
• Ask for help on Slack if you must (but please try one of the other options first, so that others can benefit from
the discussion).
Development on Cookiecutter is community-driven:
• Huge thanks to all the contributors who have pitched in to help make Cookiecutter an even better tool.
• Everyone is invited to contribute. Read the contributing instructions, then get started.
• Connect with other Cookiecutter contributors and users on Slack (note: due to work and commitments, a core
committer might not always be available)
Encouragement is unbelievably motivating. If you want more work done on Cookiecutter, show support:
• Thank a core committer for their efforts.
• Star Cookiecutter on GitHub.
• Support this project
Got criticism or complaints?
• File an issue so that Cookiecutter can be improved. Be friendly and constructive about what could be better.
Make detailed suggestions.
• Keep us in the loop so that we can help. For example, if you are discussing problems with Cookiecutter on
a mailing list, file an issue where you link to the discussion thread and/or cc at least 1 core committer on the
email.
• Be encouraging. A comment like “This function ought to be rewritten like this” is much more likely to result in
action than a comment like “Eww, look how bad this function is.”
Waiting for a response to an issue/question?
• Be patient and persistent. All issues are on the core committer team’s radar and will be considered thoughtfully,
but we have a lot of issues to work through. If urgent, it’s fine to ping a core committer in the issue with a
reminder.
• Ask others to comment, discuss, review, etc.
• Search the Cookiecutter repo for issues related to yours.
• Need a fix/feature/release/help urgently, and can’t wait? @audreyr is available for hire for consultation or
custom development.
This project is run by volunteers. Shortly we will be providing means for organizations and individuals to support the
project.
6 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
Everyone interacting in the Cookiecutter project’s codebases, issue trackers, chat rooms, and mailing lists is expected
to follow the PyPA Code of Conduct.
1.2 Overview
1.2.1 Input
cookiecutter-something/
{{ cookiecutter.project_name }}/ <--------- Project template
...
blah.txt <--------- Non-templated files/dirs
go outside
1.2.2 Output
1.3 Installation
1.3.1 Prerequisites
• Python interpreter
• Adjust your path
• Packaging tools
1.2. Overview 7
cookiecutter Documentation, Release 1.7.2
Python interpreter
Install Python for your operating system. Consult the official Python documentation for details.
You can install the Python binaries from python.org. Alternatively on macOS, you can use the homebrew package
manager.
Ensure that your bin folder is on your path for your platform. Typically ~/.local/ for UNIX and macOS, or
%APPDATA%\Python on Windows. (See the Python documentation for site.USER_BASE for full details.)
For bash shells, add the following to your .bash_profile (adjust for other shells):
Remember to load changes with source ~/.bash_profile or open a new shell session.
Windows
Ensure the directory where cookiecutter will be installed is in your environment’s Path in order to make it possible to
invoke it from a command prompt. To do so, search for “Environment Variables” on your computer (on Windows 10,
it is under System Properties –> Advanced) and add that directory to the Path environment variable, using
the GUI to edit path segments.
Example segments should look like %APPDATA%\Python\Python3x\Scripts, where you have your version
of Python instead of Python3x.
You may need to restart your command prompt session to load the environment variables.
See also:
See Configuring Python (on Windows) for full details.
Unix on Windows
You may also install Windows Subsystem for Linux or GNU utilities for Win32 to use Unix commands on Windows.
Packaging tools
pip and setuptools now come with Python 2 >=2.7.9 or Python 3 >=3.5. See the Python Packaging Authority’s
(PyPA) documentation Requirements for Installing Packages for full details.
8 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
Once the conda-forge channel has been enabled, cookiecutter can be installed with:
Debian/Ubuntu:
First, read History in detail. There are a lot of major changes. The big ones are:
• Cookiecutter no longer deletes the cloned repo after generating a project.
• Cloned repos are saved into ~/.cookiecutters/.
• You can optionally create a ~/.cookiecutterrc config file.
Upgrade Cookiecutter either with easy_install:
Or with pip:
1.3. Installation 9
cookiecutter Documentation, Release 1.7.2
1.4 Usage
$ cookiecutter cookiecutter-pypackage/
The only argument is the input directory. (The output directory is generated by rendering that, and it can’t be the same
as the input directory.)
Note: see Command Line Options for extra command line arguments
Try it out!
$ cookiecutter gh:audreyr/cookiecutter-pypackage
Cookiecutter knows abbreviations for Github (gh), Bitbucket (bb), and GitLab (gl) projects, but you can also give it
the full URL to any repository:
$ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
$ cookiecutter git+ssh://git@github.com/audreyr/cookiecutter-pypackage.git
$ cookiecutter hg+ssh://hg@bitbucket.org/audreyr/cookiecutter-pypackage
You will be prompted to enter a bunch of project config values. (These are defined in the project’s cookiecutter.json.)
Then, Cookiecutter will generate a project from the template, using the values that you entered. It will be placed in
your current directory.
And if you want to specify a branch you can do that with:
10 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
If you want to work with repos that are not hosted in github or bitbucket you can indicate explicitly the type of repo
that you want to use prepending hg+ or git+ to repo url:
$ cookiecutter hg+https://example.com/repo
In addition, one can provide a path to the cookiecutter stored on a local server:
$ cookiecutter file://server/folder/project.git
You can also distribute cookiecutter templates as Zip files. To use a Zip file template, point cookiecutter at a Zip file
on your local machine:
$ cookiecutter /path/to/template.zip
$ cookiecutter https://example.com/path/to/template.zip
If the template has already been downloaded, or a template with the same name has already been downloaded, you
will be prompted to delete the existing template before proceeding.
The Zip file contents should be the same as a git/hg repository for a template - that is, the zipfile should unpack into
a top level directory that contains the name of the template. The name of the zipfile doesn’t have to match the name
of the template - for example, you can label a zipfile with a version number, but omit the version number from the
directory inside the Zip file.
If you want to see an example Zipfile, find any Cookiecutter repository on Github and download that repository as a
zip file - Github repository downloads are in a valid format for Cookiecutter.
If your repository Zip file is password protected, Cookiecutter will prompt you for that password whenever the template
is used.
Alternatively, if you want to use a password-protected Zip file in an automated environment, you can export the
COOKIECUTTER_REPO_PASSWORD environment variable; the value of that environment variable will be used
whenever a password is required.
1.4. Usage 11
cookiecutter Documentation, Release 1.7.2
The easiest way to understand what Cookiecutter does is to create a simple one and see how it works.
Cookiecutter takes a source directory tree and copies it into your new project. It replaces all the names that it finds
surrounded by templating tags {{ and }} with names that it finds in the file cookiecutter.json. That’s basically
it.1
The replaced names can be file names, directory names, and strings inside files.
With Cookiecutter, you can easily bootstrap a new project from a standard form, which means you skip all the usual
mistakes when starting a new project.
Before you can do anything in this example, you must have Python installed on your machine. Go to the Python
Website and follow the instructions there. This includes the pip installer tool. Now run:
To get started, create a directory somewhere on your computer. The name of this directory will be the name of your
Cookiecutter template, but it doesn’t constrain anything else—the generated project doesn’t need to use the template
name, for example. Our project will be called HelloCookieCutter1:
$ mkdir HelloCookieCutter1
$ cd HelloCookieCutter1
Inside this directory, we create the directory tree to be copied into the generated project. We want to generate a name
for this directory, so we put the directory name in templating tags {{ and }} (yes, you type the double-curly-braces
onto the command line, just as you see them here):
$ mkdir {{cookiecutter.directory_name}}
$ cd {{cookiecutter.directory_name}}
Anything inside templating tags can be placed inside a namespace. Here, by putting directory_name inside the
cookiecutter namespace, cookiecutter.directory_name will be looked up from the cookiecutter.
json file as the project is generated by Cookiecutter.
Now we are inside the directory tree that will be copied. For the simplest possible Cookiecutter template, we’ll just
include a single file. Again, we want the file name to be looked up from cookiecutter.json, so we name it
appropriately:
$ touch {{cookiecutter.file_name}}.py
(touch creates an empty file; you can just open it up in your editor). Now edit the file so it contains:
print("Hello, {{cookiecutter.greeting_recipient}}!")
To finish, we create the cookiecutter.json file itself, so that Cookiecutter can look up all our templated items.
This file goes in our HelloCookieCutter1 directory, and contains all the names we’ve used:
{
"directory_name": "Hello",
"file_name": "Howdy",
(continues on next page)
1 You can also run hooks before and/or after generation, but that’s more complex than what we want to cover here.
12 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
Now we can actually run Cookiecutter and create a new project from our template. Move to a directory where you
want to create the new project. Then run Cookiecutter and hand it the directory where the template lives. On my
(Windows, so the slashes go back instead of forward) machine, this happens to be under the Git directory:
$ cookiecutter C:\Users\bruce\Documents\Git\HelloCookieCutter1
directory_name [Hello]:
file_name [Howdy]:
greeting_recipient [Julie]:
Cookiecutter tells us what the default name for each item is, and gives us the option of replacing that name with
something new. In this case, I just pressed Return for each one, to accept all the defaults.
Now we have a generated directory called Hello, containing a file Howdy.py. When we run it:
$ cd Hello
$ python Howdy.py
Hello, Julie!
$ cookiecutter https://github.com/BruceEckel/HelloCookieCutter1
Cloning into 'HelloCookieCutter1'...
remote: Counting objects: 37, done.
Unpacking objects: 21% (8/37)
remote: Total 37 (delta 19), reused 21 (delta 3), pack-reused 0
Unpacking objects: 100% (37/37), done.
Checking connectivity... done.
directory_name [Hello]: Fabulous
file_name [Howdy]: Zing
greeting_recipient [Julie]: Roscoe
$ cd Fabulous
$ python Zing.py
Hello, Roscoe!
Same effect, but this time produced from the Internet! You’ll notice that even though it says Cloning into
'HelloCookieCutter1'..., you don’t see any directory called HelloCookieCutter1 in your local di-
rectory. Cookiecutter has its own storage area for cookiecutters, which is in your home directory in a subdirectory
called .cookiecutters (the leading . hides the directory on most operating systems). You don’t need to do
anything with this directory but it can sometimes be useful to know where it is.
Now if you ever find yourself duplicating effort when starting new projects, you’ll know how to eliminate that dupli-
cation using cookiecutter. But even better, lots of people have created and published cookiecutters, so when you are
starting a new project, make sure you look at the list of pre-defined cookiecutters first!
Note: Before you begin, please install Cookiecutter 0.7.0 or higher. Instructions are in Installation.
cookiecutter-pypackage is a cookiecutter template that creates the starter boilerplate for a Python package.
Note: There are several variations of it, but for this tutorial we’ll use the original version at https://github.com/
audreyr/cookiecutter-pypackage/.
Open your shell and cd into the directory where you’d like to create a starter Python package project.
At the command line, run the cookiecutter command, passing in the link to cookiecutter-pypackage’s HTTPS clone
URL like this:
$ cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
First, cookiecutter-pypackage gets cloned to ~/.cookiecutters/ (or equivalent on Windows). Cookiecutter does this for
you, so sit back and wait.
14 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
When cloning is complete, you will be prompted to enter a bunch of values, such as full_name, email, and
project_name. Either enter your info, or simply press return/enter to accept the default values.
This info will be used to fill in the blanks for your project. For example, your name and the year will be placed into
the LICENSE file.
In your current directory, you should see that a project got generated:
$ ls
boilerplate
Looking inside the boilerplate/ (or directory corresponding to your project_slug) directory, you should see something
like this:
$ ls boilerplate/
AUTHORS.rst MANIFEST.in docs tox.ini
CONTRIBUTING.rst Makefile requirements.txt
HISTORY.rst README.rst setup.py
LICENSE boilerplate tests
=======
Credits
=======
Development Lead
----------------
Contributors
------------
Notice how it was auto-populated with your (or my) name and email.
Also take note of the fact that you are looking at a ReStructuredText file. Cookiecutter can generate a project with text
files of any type.
Great, you just generated a skeleton Python package. How did that work?
{{ cookiecutter.project_slug }}
Find the directory called {{ cookiecutter.project_slug }}. Click on it. Observe the files inside of it. You should see that
this directory and its contents corresponds to the project that you just generated.
This happens in find.py, where the find_template() method looks for the first jinja-like directory name that starts with
cookiecutter.
AUTHORS.rst
cookiecutter.json
{
"full_name": "Audrey Roy Greenfeld",
"email": "aroy@alum.mit.edu",
"github_username": "audreyr",
"project_name": "Python Boilerplate",
"project_slug": "{{ cookiecutter.project_name.lower().replace(' ', '_') }}",
"project_short_description": "Python Boilerplate contains all the boilerplate you
˓→need to create a Python package.",
1.7.5 Questions?
If anything needs better explanation, please take a moment to file an issue at https://github.com/audreyr/cookiecutter/
issues with what could be improved about this tutorial.
1.7.6 Summary
You have learned how to use Cookiecutter to generate your first project from a cookiecutter project template.
In Tutorial 2, you’ll see how to create cookiecutters of your own, from scratch.
16 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
In this tutorial, we are creating cookiecutter-website-simple, a cookiecutter for generating simple, bare-bones websites.
Create the directory for your cookiecutter and cd into it:
$ mkdir cookiecutter-website-simple
$ cd cookiecutter-website-simple/
You can have Python or Shell scripts that run before and/or after your project is generated.
Put them in hooks/ like this:
cookiecutter-something/
{{cookiecutter.project_slug}}/
hooks
pre_gen_project.py
post_gen_project.py
cookiecutter.json
cookiecutter-something/
{{cookiecutter.project_slug}}/
hooks
pre_gen_project.sh
post_gen_project.sh
cookiecutter.json
It shouldn’t be too hard to extend Cookiecutter to work with other types of scripts too. Pull requests are welcome.
For portability, you should use Python scripts (with extension .py) for your hooks, as these can be run on any platform.
However, if you intend for your template to only be run on a single platform, a shell script (or .bat file on Windows)
can be a quicker alternative.
Writing hooks
Make sure your hook scripts work in a robust manner. If a hook script fails (that is, if it finishes with a nonzero exit
status), the project generation will stop and the generated directory will be cleaned up.
When the hook scripts script are run, their current working directory is the root of the generated project. This makes
it easy for a post-generate hook to find generated files using relative paths.
Just like your project template, Cookiecutter also renders Jinja template syntax in your scripts. This lets you incorpo-
rate Jinja template variables in your scripts. For example, this line of Python sets module_name to the value of the
cookiecutter.module_name template variable:
Here is an example of a script that validates a template variable before generating the project, to be used as hooks/
pre_gen_project.py:
import re
import sys
MODULE_REGEX = r'^[_a-zA-Z][_a-zA-Z0-9]+$'
18 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
If you use Cookiecutter a lot, you’ll find it useful to have a user config file. By default Cookiecutter tries to retrieve
settings from a .cookiecutterrc file in your home directory.
From version 1.3.0 you can also specify a config file on the command line via --config-file:
$ export COOKIECUTTER_CONFIG=/home/audreyr/my-custom-config.yaml
If you wish to stick to the built-in config and not load any user config file at all, use the cli option
--default-config instead. Preventing Cookiecutter from loading user settings is crucial for writing integration
tests in an isolated environment.
Example user config:
default_context:
full_name: "Audrey Roy"
email: "audreyr@example.com"
github_username: "audreyr"
cookiecutters_dir: "/home/audreyr/my-custom-cookiecutters-dir/"
replay_dir: "/home/audreyr/my-custom-replay-dir/"
abbreviations:
pp: https://github.com/audreyr/cookiecutter-pypackage.git
gh: https://github.com/{0}.git
bb: https://bitbucket.org/{0}
This is useful if, for example, you’re writing a web framework and need to provide developers with a tool similar to
django-admin.py startproject or npm init.
You can specify an extra_context dictionary that will override values from cookiecutter.json or .cookiecutterrc:
cookiecutter('cookiecutter-pypackage/',
extra_context={'project_name': 'TheGreatest'})
You will also need to add these keys to the cookiecutter.json or .cookiecutterrc.
{
"timestamp": "{{ cookiecutter.timestamp }}"
}
This Python script will dynamically inject a timestamp value as the project is generated:
cookiecutter(
'cookiecutter-django',
extra_context={'timestamp': datetime.utcnow().isoformat()}
)
20 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
If you combine an extra_context dict with the no_input argument, you can programmatically create the project with a
set list of context parameters and without any command line prompts:
cookiecutter('cookiecutter-pypackage/',
no_input=True,
extra_context={'project_name': 'TheGreatest'})
The values (but not the keys!) of cookiecutter.json are also Jinja2 templates. Values from user prompts are added to the
context immediately, such that one context value can be derived from previous values. This approach can potentially
save your user a lot of keystrokes by providing more sensible defaults.
{
"project_name": "My New Project",
"project_slug": "{{ cookiecutter.project_name|lower|replace(' ', '-') }}",
"pkg_name": "{{ cookiecutter.project_slug|replace('-', '') }}"
}
If the user takes the defaults, or uses no_input, the templated values will be:
• my-new-project
• mynewproject
Or, if the user gives Yet Another New Project, the values will be:
• yet-another-new-project
• yetanothernewproject
{
"project_slug": "sample",
"_copy_without_render": [
"*.html",
"*not_rendered_dir",
"rendered_dir/not_rendered_file.ini"
]
}
{
"cookiecutter": {
"app_class_name": "FooBarApp",
"app_title": "Foo Bar",
"email": "raphael@example.com",
"full_name": "Raphael Pierzina",
"github_username": "hackebrot",
"kivy_version": "1.8.0",
"project_slug": "foobar",
"short_description": "A sleek slideshow app that supports swipe gestures.",
"version": "0.1.0",
"year": "2015"
}
}
To fetch this context data without being prompted on the command line you can use either of the following methods.
Pass the according option on the CLI:
This feature is comes in handy if, for instance, you want to create a new project from an updated template.
22 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
-V, --version
Show the version and exit.
--no-input
Do not prompt for parameters and only use cookiecutter.json file content
-c, --checkout
branch, tag or commit to checkout after git clone
--directory
Directory within repo that holds cookiecutter.json file for advanced repositories with multi templates in it
-v, --verbose
Print debug information
--replay
Do not prompt for parameters and only use information entered previously
-f, --overwrite-if-exists
Overwrite the contents of the output directory if it already exists
-s, --skip-if-file-exists
Skip the files in the corresponding directories if they already exist
-o, --output-dir
Where to output the generated project dir into
--config-file
User configuration file
--default-config
Do not load a config file. Use the defaults instead
--debug-file
File to be used as a stream for DEBUG logging
Choice variables provide different choices when creating a project. Depending on a user’s choice the template renders
things differently.
Basic Usage
Choice variables are regular key / value pairs, but with the value being a list of strings.
For example, if you provide the following choice variable in your cookiecutter.json:
{
"license": ["MIT", "BSD-3", "GNU GPL v3.0", "Apache Software License 2.0"]
}
Select license:
1 - MIT
2 - BSD-3
3 - GNU GPL v3.0
4 - Apache Software License 2.0
Choose from 1, 2, 3, 4 [1]:
{% endif %}
License
-------
{
"license": ["MIT", "BSD-3", "GNU GPL v3.0", "Apache Software License 2.0"]
}
By default, the first entry in the values list serves as default value in the prompt.
Setting the default license agreement to Apache Software License 2.0 can be done using:
default_context:
license: "Apache Software License 2.0"
Select license:
1 - Apache Software License 2.0
2 - MIT
3 - BSD-3
4 - GNU GPL v3.0
Choose from 1, 2, 3, 4 [1]:
24 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
Note: As you can see the order of the options changed from 1 - MIT to 1 - Apache Software License
2.0. Cookiecutter takes the first value in the list as the default.
Dictionary variables provide a way to define deep structured information when rendering a template.
Basic Usage
Dictionary variables are, as the name suggests, dictionaries of key-value pairs. The dictionary values can, themselves,
be other dictionaries and lists - the data structure can be as deep as you need.
For example, you could provide the following dictionary variable in your cookiecutter.json:
{
"project_slug": "new_project",
"file_types": {
"png": {
"name": "Portable Network Graphic",
"library": "libpng",
"apps": [
"GIMP"
]
},
"bmp": {
"name": "Bitmap",
"library": "libbmp",
"apps": [
"Paint",
"GIMP"
]
}
}
}
The above file_type dictionary variable creates cookiecutter.file_types, which can be used like this:
<dt>Extension:</dt>
<dd>{{ extension }}</dd>
<dt>Applications:</dt>
<dd>
<ul>
{% for app in details.apps -%}
<li>{{ app }}</li>
{% endfor -%}
</ul>
</dd>
(continues on next page)
Cookiecutter is using Jinja2’s for expression to iterate over the items in the dictionary.
{
"project_slug": "Foobar",
"year": "{% now 'utc', '%Y' %}",
"_extensions": ["jinja2_time.TimeExtension"]
}
On invocation Cookiecutter tries to import the extensions and add them to its environment respectively.
In the above example, Cookiecutter provides the additional tag now, after installing the jinja2_time.TimeExtension
and enabling it in cookiecutter.json.
Please note that Cookiecutter will not install any dependencies on its own! As a user you need to make sure you have
all the extensions installed, before running Cookiecutter on a template that requires custom Jinja2 extensions.
By default Cookiecutter includes the following extensions:
• cookiecutter.extensions.JsonifyExtension
• cookiecutter.extensions.RandomStringExtension
• jinja2_time.TimeExtension
Jsonify extension
Would output:
{"a": true}
26 Chapter 1. Basics
cookiecutter Documentation, Release 1.7.2
{{ random_ascii_string(12) }}
Outputs:
bIIUczoNvswh
{{ random_ascii_string(12, punctuation=True) }}
Outputs:
fQupUkY}W!)!
Slugify extension
Would output:
it-s-a-random-version
It is diferent from a mere replace of spaces since it also trates some special characters such as ‘ in the example above.
The function accepts all arguments that can be passed to the slugify function of python-slugify. For example to change
the output from it-s-a-random-version to it_s_a_random_version, the parameter separator=’_’ would be passed to
slugify().
https://github.com/user/repo-name.git
directory1-name/
| {{cookiecutter.project_slug}}/
| cookiecutter.json
directory2-name/
{{cookiecutter.project_slug}}/
cookiecutter.json
1.10 Troubleshooting
1.10.1 I created a cookiecutter, but it doesn’t work, and I can’t figure out why
• Try upgrading to Cookiecutter 0.8.0, which prints better error messages and has fixes for several common bugs.
1.10.2 I’m having trouble generating Jinja templates from Jinja templates
{{ "{{" }}
Or this:
{% raw %}
<p>Go <a href="{{ url_for('home') }}">Home</a></p>
{% endraw %}
Or this:
{{ {{ url_for('home') }} }}
28 Chapter 1. Basics
CHAPTER 2
API Reference
2.1.1 Submodules
29
cookiecutter Documentation, Release 1.7.2
cookiecutter.config.merge_configs(default, overwrite)
Recursively update a dict with the key/value pair of another.
Dict values that are dictionaries themselves will be updated, whilst preserving existing keys.
All exceptions used in the Cookiecutter code base are defined here.
exception cookiecutter.exceptions.ConfigDoesNotExistException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for missing config file.
Raised when get_config() is passed a path to a config file, but no file is found at that path.
exception cookiecutter.exceptions.ContextDecodingException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for failed JSON decoding.
Raised when a project’s JSON context file can not be decoded.
exception cookiecutter.exceptions.CookiecutterException
Bases: Exception
Base exception class.
All Cookiecutter-specific exceptions should subclass this class.
exception cookiecutter.exceptions.FailedHookException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for hook failures.
Raised when a hook script fails.
exception cookiecutter.exceptions.InvalidConfiguration
Bases: cookiecutter.exceptions.CookiecutterException
Exception for invalid configuration file.
Raised if the global configuration file is not valid YAML or is badly constructed.
exception cookiecutter.exceptions.InvalidModeException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for incompatible modes.
Raised when cookiecutter is called with both no_input==True and replay==True at the same time.
exception cookiecutter.exceptions.InvalidZipRepository
Bases: cookiecutter.exceptions.CookiecutterException
Exception for bad zip repo.
Raised when the specified cookiecutter repository isn’t a valid Zip archive.
exception cookiecutter.exceptions.MissingProjectDir
Bases: cookiecutter.exceptions.CookiecutterException
Exception for missing generated project directory.
Raised during cleanup when remove_repo() can’t find a generated project directory inside of a repo.
exception cookiecutter.exceptions.NonTemplatedInputDirException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for when a project’s input dir is not templated.
The name of the input directory should always contain a string that is rendered to something else, so that
input_dir != output_dir.
exception cookiecutter.exceptions.OutputDirExistsException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for existing output directory.
Raised when the output directory of the project exists already.
exception cookiecutter.exceptions.RepositoryCloneFailed
Bases: cookiecutter.exceptions.CookiecutterException
Exception for un-cloneable repo.
Raised when a cookiecutter template can’t be cloned.
exception cookiecutter.exceptions.RepositoryNotFound
Bases: cookiecutter.exceptions.CookiecutterException
Exception for missing repo.
Raised when the specified cookiecutter repository doesn’t exist.
exception cookiecutter.exceptions.UndefinedVariableInTemplate(message, error,
context)
Bases: cookiecutter.exceptions.CookiecutterException
Exception for out-of-scope variables.
Raised when a template uses a variable which is not defined in the context.
exception cookiecutter.exceptions.UnknownExtension
Bases: cookiecutter.exceptions.CookiecutterException
Exception for un-importable extention.
Raised when an environment is unable to import a required extension.
exception cookiecutter.exceptions.UnknownRepoType
Bases: cookiecutter.exceptions.CookiecutterException
Exception for unknown repo types.
Raised if a repo’s type cannot be determined.
exception cookiecutter.exceptions.UnknownTemplateDirException
Bases: cookiecutter.exceptions.CookiecutterException
Exception for ambiguous project template directory.
Raised when Cookiecutter cannot determine which directory is the project template, e.g. more than one dir
appears to be a template dir.
exception cookiecutter.exceptions.VCSNotInstalled
Bases: cookiecutter.exceptions.CookiecutterException
Exception when version control is unavailable.
Raised if the version control system (git or hg) is not installed.
Jinja2 extensions.
class cookiecutter.extensions.JsonifyExtension(environment)
Bases: jinja2.ext.Extension
Jinja2 extension to convert a Python object to JSON.
identifier = 'cookiecutter.extensions.JsonifyExtension'
class cookiecutter.extensions.RandomStringExtension(environment)
Bases: jinja2.ext.Extension
Jinja2 extension to create a random string.
identifier = 'cookiecutter.extensions.RandomStringExtension'
class cookiecutter.extensions.SlugifyExtension(environment)
Bases: jinja2.ext.Extension
Jinja2 Extension to slugify string.
identifier = 'cookiecutter.extensions.SlugifyExtension'
Parameters
• project_dir – Absolute path to the resulting generated project.
• infile – Input file to generate the file from. Relative to the root template dir.
• context – Dict for populating the cookiecutter’s variables.
• env – Jinja2 template execution environment.
cookiecutter.generate.is_copy_only_path(path, context)
Check whether the given path should only be copied and not rendered.
Returns True if path matches a pattern in the given context dict, otherwise False.
Parameters
• path – A file-system path referring to a file or dir that should be rendered or just copied.
• context – cookiecutter context.
cookiecutter.generate.render_and_create_dir(dirname, context, output_dir, environment,
overwrite_if_exists=False)
Render name of a directory, create the directory, return its path.
cookiecutter.hooks.valid_hook(hook_file, hook_name)
Determine if a hook file is valid.
Parameters
• hook_file – The hook file to consider for validity
• hook_name – The hook to find
Returns The hook file validity
Parameters
• question (str) – Question to the user
• default_value – Value that will be returned if no input happens
cookiecutter.replay.
cookiecutter.utils.work_in(dirname=None)
Context manager version of os.chdir.
When exited, returns to the working directory prior to entering.
Utility functions for handling and fetching repo archives in zip format.
cookiecutter.zipfile.unzip(zip_uri, is_url, clone_to_dir=’.’, no_input=False, password=None)
Download and unpack a zipfile at a given URI.
This will download the zipfile to the cookiecutter repository, and unpack into a temporary directory.
Parameters
• zip_uri – The URI for the zipfile.
• is_url – Is the zip URI a URL or a file?
• clone_to_dir – The cookiecutter repository directory to put the archive into.
• no_input – Suppress any prompts
• password – The password to use when unpacking the repository.
Project Info
3.1 Contributing
Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.
• Types of Contributions
• Contributor Setup
• Contributor Guidelines
• Contributor Testing
• Core Committer Guide
Report Bugs
41
cookiecutter Documentation, Release 1.7.2
Fix Bugs
Look through the GitHub issues for bugs. Anything tagged with “bug” is open to whoever wants to implement it.
Implement Features
Look through the GitHub issues for features. Anything tagged with “enhancement” and “please-help” is open to
whoever wants to implement it.
Please do not combine multiple feature enhancements into a single pull request.
Note: this project is very conservative, so new features that aren’t tagged with “please-help” might not get into core.
We’re trying to keep the code base small, extensible, and streamlined. Whenever possible, it’s best to try and implement
feature ideas as separate projects outside of the core codebase.
Write Documentation
Cookiecutter could always use more documentation, whether as part of the official Cookiecutter docs, in docstrings,
or even on the web in blog posts, articles, and such.
If you want to review your changes on the documentation locally, you can do:
This will compile the documentation, open it in your browser and start watching the files for changes, recompiling as
you save.
Submit Feedback
1. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up
your fork for local development:
mkvirtualenv cookiecutter
cd cookiecutter/
python setup.py develop
Please note that tox runs lint check automatically, since we have a test environment for it.
If you feel like running only the lint environment, please use the following command:
tox -e lint
1. Ensure that your feature or commit is fully covered by tests. Check report after regular tox run. You can also
run coverage only report and get html report with statement by statement highlighting:
tox -e cov-report
You report will be placed to htmlcov directory. Please do not include this directory to your commits. By default this
directory in our .gitignore file.
1. Commit your changes and push your branch to GitHub:
git add .
git commit -m "Your detailed description of your changes."
git push origin name-of-your-bugfix-or-feature
Before you submit a pull request, check that it meets these guidelines:
1. The pull request should include tests.
2. If the pull request adds functionality, the docs should be updated. Put your new functionality into a function
with a docstring, and add the feature to the list in README.md.
3. The pull request must pass all CI/CD jobs before being ready for review.
4. If one CI/CD job is failing for unrelated reasons you may want to create another PR to fix that first.
3.1. Contributing 43
cookiecutter Documentation, Release 1.7.2
Coding Standards
• PEP8
• Functions over classes except in tests
• Quotes via http://stackoverflow.com/a/56190/5549
– Use double quotes around strings that are used for interpolation or that are natural language messages
– Use single quotes for small symbol-like strings (but break the rules if the strings contain quotes)
– Use triple double quotes for docstrings and raw string literals for regular expressions even if they aren’t
needed.
– Example:
LIGHT_MESSAGES = {
'English': "There are %(number_of_lights)s lights.",
'Pirate': "Arr! Thar be %(number_of_lights)s lights."
}
def lights_message(language, number_of_lights):
"""Return a language-appropriate string reporting the light count."""
return LIGHT_MESSAGES[language] % locals()
def is_pirate(message):
"""Return True if the given message sounds piratical."""
return re.search(r"(?i)(arr|avast|yohoho)!", message) is not None
Tox uses py.test under the hood, hence it supports the same syntax for selecting tests.
For further information please consult the pytest usage docs.
To run a particular test class with tox:
To run all tests using various versions of python in virtualenvs defined in tox.ini, just run tox:
tox
This configuration file setup the pytest-cov plugin and it is an additional dependency. It generate a coverage report
after the tests.
It is possible to tests with some versions of python, to do this the command is:
tox -e py27,py35,pypy
Will run py.test with the python2.7, python3.5 and pypy interpreters, for example.
Command-Line Accessible
API Accessible
Being Jinja2-specific
Extensible
Being extendable by people with different ideas for Jinja2-based project template tools.
• Entirely function-based
• Aim for statelessness
• Lets anyone write more opinionated tools
Freedom for Cookiecutter users to build and extend.
• No officially-maintained cookiecutter templates, only ones by individuals
• Commercial project-friendly licensing, allowing for private cookiecutters and private Cookiecutter-based tools
3.1. Contributing 45
cookiecutter Documentation, Release 1.7.2
Cookiecutter is designed to do one thing, and do that one thing very well.
• Cover the use cases that the core committers need, and as little as possible beyond that :)
• Generates project templates from the command-line or API, nothing more
• Minimize internal line of code (LOC) count
• Ultra-fast project generation for high performance downstream tools
Inclusive
Stable
VCS-Hosted Templates
Process: Issues
If an issue is a bug that needs an urgent fix, mark it for the next patch release.Then either fix it or mark as please-help.
For other issues: encourage friendly discussion, moderate debate, offer your thoughts.
New features require a +1 from 2 other core committers (besides yourself).
Process: Roadmap
If you merge a pull request, you’re responsible for updating AUTHORS.md and HISTORY.md
When you’re processing the first change after a release, create boilerplate following the existing pattern:
## x.y.z (Development)
Features:
Bug Fixes:
Other changes:
3.1. Contributing 47
cookiecutter Documentation, Release 1.7.2
All code changes, regardless of who does them, need to be reviewed and merged by someone else.This rule applies to
all the core committers.
Exceptions:
• Minor corrections and fixes to pull requests submitted by others.
• While making a formal release, the release manager can make necessary, appropriate changes.
• Small documentation changes that reinforce existing subject matter. Most commonly being, but not limited to
spelling and grammar corrections.
Responsibilities
• Ensure cross-platform compatibility for every change that’s accepted. Windows, Mac, Debian & Ubuntu Linux.
• Ensure that code that goes into core meets all requirements in this checklist: https://gist.github.com/audreyr/
4feef90445b9680475f2
• Create issues for any major changes and enhancements that you wish to make. Discuss things transparently and
get community feedback.
• Don’t add any classes to the codebase unless absolutely needed. Err on the side of using functions.
• Keep feature versions as small as possible, preferably one new feature per version.
• Be welcoming to newcomers and encourage diverse new contributors from all backgrounds. Look at Code of
Conduct.
Contributors may be given core commit privileges. Preference will be given to those with:
1. Past contributions to Cookiecutter and other open-source projects. Contributions to Cookiecutter include both
code (both accepted and pending) and friendly participation in the issue tracker. Quantity and quality are con-
sidered.
2. A coding style that the other core committers find simple, minimal, and clean.
3. Access to resources for cross-platform development and testing.
4. Time to devote to the project regularly.
3.2 Credits
3.2.3 Contributors
3.2. Credits 49
cookiecutter Documentation, Release 1.7.2
3.2. Credits 51
cookiecutter Documentation, Release 1.7.2
• @delirious-lettuce (@delirious-lettuce)
• Gasper Vozel (@karantan)
• Joshua Carp (@jmcarp)
• @meahow (@meahow)
• Andrea Grandi (@andreagrandi)
• Issa Jubril (@jubrilissa)
• Nytiennzo Madooray (@Nythiennzo)
• Erik Bachorski (@dornheimer)
• cclauss (@cclauss)
• Andy Craze (@accraze)
• Anthony Sottile (@asottile)
• Jonathan Sick (@jonathansick)
• Hugo (@hugovk)
• Min ho Kim (@minho42)
• Ryan Ly (@rly)
• Akintola Rahmat (@mihrab34)
• Jai Ram Rideout (@jairideout)
• Diego Carrasco Gubernatis (@dacog)
• Wagner Negrão (@wagnernegrao)
• Josh Barnes (@jcb91)
• Nikita Sobolev (@sobolevn)
• Matt Stibbs (@mattstibbs)
• MinchinWeb (@MinchinWeb)
• kishan (@kishan)
• tonytheleg (@tonytheleg)
• Roman Hartmann (@RomHartmann)
• DSEnvel (@DSEnvel)
• kishan (@kishan)
• Bruno Alla (@browniebroke)
• nicain (@nicain)
• Carsten Rösnick-Neugebauer (@croesnick)
• igorbasko01 (@igorbasko01)
• Dan Booth Dev (@DanBoothDev)
• Pablo Panero (@ppanero)
• Chuan-Heng Hsiao (@chhsiao1981)
• Mohammad Hossein Sekhavat (@mhsekhavat)
The following people made contributions to the cookiecutter project at the PyCon sprints in Portland, OR from June
2-5 2016. Contributions include user testing, debugging, improving documentation, reviewing issues, writing tutorials,
creating and updating project templates, and teaching each other.
• Adam Chainz (@adamchainz)
• Andrew Ittner (@tephyr)
• Audrey Roy Greenfeld (@audreyr)
• Carol Willing (@willingc)
• Christopher Clarke (@chrisdev)
• Citlalli Murillo (@citmusa)
• Daniel Roy Greenfeld (@pydanny)
• Diane DeMers Chen (@purplediane)
• Elaine Wong (@elainewong)
• Elias Dorneles (@eliasdorneles)
• Emily Cain (@emcain)
• John Roa (@jhonjairoroa87)
• Jonan Scheffler (@1337807)
• Phoebe Bauer (@phoebebauer)
• Kartik Sundararajan (@skarbot)
• Katia Lira (@katialira)
• Leonardo Jimenez (@xpostudio4)
• Lindsay Slazakowski (@lslaz1)
• Meghan Heintz (@dot2dotseurat)
• Raphael Pierzina (@hackebrot)
• Umair Ashraf (@umrashrf)
• Valdir Stumm Junior (@stummjr)
• Vivian Guillen (@viviangb)
• Zaro (@zaro0508)
3.4 History
• Do not modify this file, since 1.7.1 Changes are generated on Pull request title and will be added before release.
• Fixed: Jinja2&Six version limits causing build errors with ansible project @insspb (#1385)
This release was focused on internal code and CI/CD changes. During this release all code was verified to match pep8,
pep257 and other code-styling guides.Project CI/CD was significantly changed, Windows platform checks based on
Appveyor engine was replaced by GitHub actions tests. Appveyor was removed. Also our CI/CD was extended with
Mac builds, to verify project builds on Apple devices.
Important Changes:
• Added: Added debug messages for get_user_config @ssbarnea (#1357)
• Multiple templates per one repository feature added. @RomHartmann (#1224, #1063)
• Update replay.py json.dump indent for easy viewing @nicain (#1293)
• ‘future’ library replaced with ‘six’ as a more lightweight python porting library @asottile (#941)
• Added extension: Slugify template filter @ppanero (#1336)
• Added command line option: --skip-if-file-exists, allow to skip the existing files when doing
overwrite_if_exists. @chhsiao1981 (#1076)
• Some packages versions limited to be compatible with python2.7 and python 3.5 @insspb (#1349)
Internal CI/CD and tests changes:
• Coverage comment in future merge requests disabled @ssbarnea (#1279)
• Fixed Python 3.8 travis tests and setup.py message @insspb (#1295, #1297)
• Travis builds extended with Windows setup for all supported python versions @insspb (#1300, #1301)
• Update .travis.yml to be compatible with latest travis cfg specs @luzfcb (#1346)
• Added new test to improve tests coverage @amey589 (#1023)
• Added missed coverage lines highlight to pytest-coverage report @insspb (#1352)
• pytest-catchlog package removed from test_requirements, as now it is included in pytest @insspb (#1347)
• Fixed cov-report tox invocation environment @insspb (#1350)
• Added: Release drafter support and configuration to exclude changelog update work and focus on development
@ssbarnea @insspb (#1356, #1362)
• Added: CI/CD steps for Github actions to speedup CI/CD @insspb (#1360)
• Removed: Appveyor CI/CD completely removed @insspb @ssbarnea @insspb (#1363, #1367)
Code style and docs changes:
• Added black formatting verification on lint stage + project files reformatting @ssbarnea @insspb (#1368)
• Added pep257 docstring for tests/* files @insspb (#1369, #1370, #1371, #1372, #1373, #1374, #1375, #1376,
#1377, #1378, #1380, #1381)
Important Changes:
• Drop support for EOL Python 3.4, thanks to @jamescurtin and @insspb (#1024)
• Drop support for EOL Python 3.3, thanks to @hugovk (#1024)
• Increase the minimum click version to 7.0, thanks to @rly and @luzfcb (#1168)
Other Changes:
• PEP257 fixing docstrings in exceptions.py. Thanks to @MinchinWeb (#1237)
• PEP257 fixing docstrings in replay.py. Thanks to @kishan (#1234)
• PEP257 fixing docstrings in test_unzip.py. Thanks to @tonytheleg and @insspb (#1236, #1262)
• Fixed tests sequence for appveyor, to exclude file not found bug. Thanks to @insspb (#1257)
• Updates REAMDE.md with svg badge for appveyor. Thanks to @sobolevn (#1254)
• Add missing {% endif %} to Choice Variables example. Thanks to @mattstibbs (#1249)
• Core documentation converted to Markdown format thanks to @wagnernegrao, @insspb (#1216)
• Tests update: use sys.executable when invoking python in python 3 only environment thanks to @vincentbernat
(#1221)
• Prevent click API v7.0 from showing choices when already shown, thanks to @rly and @luzfcb (#1168)
• Test the codebase with python3.8 beta on tox and travis-ci (#1206), thanks to @mihrab34
• Add a CODE_OF_CONDUCT.md file to the project, thanks to @andreagrandi (#1009)
3.4. History 55
cookiecutter Documentation, Release 1.7.2
New Features:
• Include template path or template URL in cookiecutter context under _template, thanks to @aroig (#774)
• Add a URL abbreviation for GitLab template projects, thanks to @hackebrot (#963)
• Add option to use templates from Zip files or Zip URLs, thanks to @freakboy3742 (#961)
Bug Fixes:
• Fix an issue with missing default template abbreviations for when a user defined custom abbreviations, thanks
to @noirbizarre for the issue report and @hackebrot for the fix (#966, #967)
• Preserve existing output directory on project generation failure, thanks to @ionelmc for the report and
@michaeljoseph for the fix (#629, #964)
• Fix Python 3.x error handling for git operation failures, thanks to @jmcarp (#905)
Other Changes:
• Fix broken link to Copy without Render docs, thanks to @coreysnyder04 (#912)
• Improve debug log message for when a hook is not found, thanks to @raphigaziano (#160)
• Fix module summary and expand_abbreviations() doc string as per pep257, thanks to @terryjbates
(#772)
• Update doc strings in cookiecutter/cli.py and cookiecutter/config.py according to pep257,
thanks to @terryjbates (#922, #931)
• Update doc string for is_copy_only_path() according to pep257, thanks to @mathagician and @terryj-
bates (#935, #949)
• Update doc strings in cookiecutter/extensions.py according to pep257, thanks to @meahow (#996)
• Fix miscellaneous issues with building docs, thanks to @stevepiercy (#889)
• Re-implement Makefile and update several make rules, thanks to @hackebrot (#930)
• Fix broken link to pytest docs, thanks to @eyalev for the issue report and @devstrat for the fix (#939, #940)
• Add test_requirements.txt file for easier testing outside of tox, thanks to @ramnes (#945)
• Improve wording in copy without render docs, thanks to @eyalev (#938)
• Fix a number of typos, thanks to @delirious-lettuce (#968)
• Improved extra context docs by noting that extra context keys must be present in the template’s
cookiecutter.json, thanks to @karantan for the report and fix (#863, #864)
• Added more cookiecutter templates to the mix:
– cookiecutter-kata-cpputest by @13coders (#901)
– cookiecutter-kata-gtest by @13coders (#901)
– cookiecutter-pyramid-talk-python-starter by @mikeckennedy (#915)
– cookiecutter-android by @alexfu (#890)
– cookiecutter-lux-python by @alexkey (#895)
– cookiecutter-git by @tuxredux (#921)
– cookiecutter-ansible-role-ci by @ferrarimarco (#903)
– cookiecutter_dotfile by @bdcaf (#925)
– painless-continuous-delivery by @painless-software (#927)
– cookiecutter-molecule by @retr0h (#954)
– sublime-snippet-package-template by @agenoria (#956)
– cookiecutter-conda-python by @conda (#969)
– cookiecutter-flask-minimal by @candidtim (#977)
– cookiecutter-pypackage-rust-cross-platform-publish by @mckaymatt (#957)
– cookie-cookie by @tuxredux (#951)
– cookiecutter-telegram-bot by @Ars2014 (#984)
3.4. History 57
cookiecutter Documentation, Release 1.7.2
New Features:
• Major update to installation documentation, thanks to @stevepiercy (#880)
Bug Fixes:
• Resolve an issue around default values for dict variables, thanks to @e-kolpakov for raising the issue and
@hackebrot for the PR (#882, #884)
Other Changes:
• Contributor documentation reST fixes, thanks to @stevepiercy (#878)
• Added more cookiecutter templates to the mix:
– widget-cookiecutter by @willingc (#781)
– cookiecutter-django-foundation by @Parbhat (#804)
– cookiecutter-tornado by @hkage (#807)
– cookiecutter-django-ansible by @Ivaylo-Bachvarov(#816)
– CICADA by @elenimijalis (#840)
– cookiecutter-tf-module by @VDuda (#843)
– cookiecutter-pyqt4 by @aeroaks (#847)
– cookiecutter-golang by @mjhea0 and @lacion (#872, #873)
– cookiecutter-elm, cookiecutter-java and cookiecutter-spring-boot by @m-x-k (#879)
The primary goal of this release was to add command-line support for passing extra context, address minor bugs and
make a number of improvements.
New Features:
• Inject extra context with command-line arguments, thanks to @msabramo and @michaeljoseph (#666).
• Updated conda installation instructions to work with the new conda-forge distribution of Cookiecutter, thanks
to @pydanny and especially @bollwyvl (#232, #705).
• Refactor code responsible for interaction with version control systems and raise better error messages, thanks to
@michaeljoseph (#778).
• Add support for executing cookiecutter using python -m cookiecutter or from a checkout/zip file,
thanks to @brettcannon (#788).
• New CLI option --debug-file PATH to store a log file on disk. By default no log file is written. Entries
for DEBUG level and higher. Thanks to @hackebrot(#792).
3.4. History 59
cookiecutter Documentation, Release 1.7.2
The goal of this release is changing to a strict Jinja2 environment, paving the way to more awesome in the future, as
well as adding support for Jinja2 extensions.
New Features:
3.4. History 61
cookiecutter Documentation, Release 1.7.2
The goal of this release is to extend the user config feature and to make hook execution more robust.
New Features:
• Abort project generation if pre_gen_project or post_gen_project hook scripts fail, thanks to @elias-
dorneles (#464, #549)
• Extend user config capabilities with additional cli options --config-file and --default-config and
environment variable COOKIECUTTER_CONFIG, thanks to @jhermann, @pfmoore, and @hackebrot (#258,
#424, #565)
Bug Fixes:
• Fixed conditional dependencies for wheels in setup.py, thanks to @hackebrot (#557, #568)
• Reverted skipif markers to use correct reasons (bug fixed in pytest), thanks to @hackebrot (#574)
Other Changes:
• Improved path and documentation for rendering the Sphinx documentation, thanks to @eliasdorneles and
@hackebrot (#562, #583)
• Added additional help entrypoints, thanks to @michaeljoseph (#563, #492)
• Added Two Scoops Academy to the README, thanks to @hackebrot (#576)
• Now handling trailing slash on URL, thanks to @ramiroluz (#573, #546)
• Support for testing x86 and x86-64 architectures on appveyor, thanks to @maiksensi (#567)
• Made tests work without installing Cookiecutter, thanks to @vincentbernat (#550)
• Encoded the result of the hook template to utf8, thanks to @ionelmc (#577. #578)
• Added test for _run_hook_from_repo_dir, thanks to @hackebrot (#579, #580)
• Implemented bumpversion, thanks to @hackebrot (#582)
• Added more cookiecutter templates to the mix:
– cookiecutter-octoprint-plugin by @foosel (#560)
– wagtail-cookiecutter-foundation by @chrisdev, et al. (#566)
3.4. History 63
cookiecutter Documentation, Release 1.7.2
Other Changes:
• Enable py35 support on Travis by using Python 3.5 as base Python (@maiksensi / #540)
• If a filename is empty, do not generate. Log instead (@iljabauer / #444)
• Fix tests as per last changes in cookiecutter-pypackage, thanks to @eliasdorneles(#555).
• Removed deprecated cookiecutter-pylibrary-minimal from the list, thanks to @ionelmc (#556)
• Moved to using rualmel.yaml instead of PyYAML, except for Windows users on Python 2.7, thanks to @py-
danny (#557)
Why 1.2.1 instead of 1.2.0? There was a problem in the distribution that we pushed to PyPI. Since you can’t replace
previous files uploaded to PyPI, we deleted the files on PyPI and released 1.2.1.
The goals of this release were copy without render and a few additional command-line options such as
--overwrite-if-exists, ---replay, and output-dir.
Features:
• Added copy without render feature, making it much easier for developers of Ansible, Salt Stack, and other
recipe-based tools to work with Cookiecutter. Thanks to @osantana and @LucianU for their innovation, as well
as @hackebrot for fixing the Windows problems (#132, #184, #425).
• Added specify output directory, thanks to @tony and @hackebrot (#531, #452).
• Abort template rendering if the project output directory already exists, thanks to @lgp171188 (#470, #471).
• Add a flag to overwrite existing output directory, thanks to @lgp171188 for the implementation (#495) and
@schacki, @ionelmc, @pydanny and @hackebrot for submitting issues and code reviews (#475, #493).
• Remove test command in favor of tox, thanks to @hackebrot (#480).
• Allow cookiecutter invocation, even without installing it, via python -m cookiecutter.cli, thanks to
@vincentbernat and @hackebrot (#449, #487).
• Improve the type detection handler for online and offline repositories, thanks to @charlax (#490).
• Add replay feature, thanks to @hackebrot (#501).
• Be more precise when raising an error for an invalid user config file, thanks to @vaab and @hackebrot (#378,
#528).
• Added official Python 3.5 support, thanks to @pydanny and @hackebrot (#522).
• Added support for choice variables and switch to click style prompts, thanks to @hackebrot (#441, #455).
Other Changes:
• Updated click requirement to < 6.0, thanks to @pydanny (#473).
• Added landscape.io flair, thanks to @michaeljoseph (#439).
• Descriptions of PEP8 specifications and milestone management, thanks to @michaeljoseph (#440).
– Added alternate installation options in the documentation, thanks to @pydanny (#117, #315).
• The test of the which() function now tests against the date command, thanks to @vincentbernat (#446)
• Ensure file handles in setup.py are closed using with statement, thanks to @svisser (#280).
• Removed deprecated and fully extraneous compat.is_exe() function, thanks to @hackebrot (#485).
• Disabled sudo in .travis, thanks to @hackebrot (#482).
The goals of this release was to formally remove support for Python 2.6 and continue the move to using py.test.
Features:
• Convert the unittest suite to py.test for the sake of comprehensibility, thanks to @hackebrot (#322, #332, #334,
#336, #337, #338, #340, #341, #343, #345, #347, #351, #412, #413, #414).
• Generate pytest coverage, thanks to @michaeljoseph (#326).
• Documenting of Pull Request merging and HISTORY.rst maintenance, thanks to @michaeljoseph (#330).
• Large expansions to the tutorials thanks to @hackebrot (#384)
• Switch to using Click for command-line options, thanks to @michaeljoseph (#391, #393).
• Added support for working with private repos, thanks to @marctc (#265).
• Wheel configuration thanks to @michaeljoseph (#118).
Other Changes:
• Formally removed support for 2.6, thanks to @pydanny (#201).
3.4. History 65
cookiecutter Documentation, Release 1.7.2
• Moved to codecov for continuous integration test coverage and badges, thanks to @michaeljoseph (#71, #369).
• Made JSON parsing errors easier to debug, thanks to @rsyring and @mark0978 (#355, #358, #388).
• Updated to Jinja 2.7 or higher in order to control trailing new lines in templates, thanks to @sfermigier (#356).
• Tweaked flake8 to ignore e731, thanks to @michaeljoseph (#390).
• Fixed failing Windows tests and corrected AppVeyor badge link thanks to @msabramo (#403).
• Added more Cookiecutters to the list:
– cookiecutter-scala-spark by @jpzk
– cookiecutter-atari2600 by @joeyjoejoejr
– cookiecutter-bottle by @avelino
– cookiecutter-latex-article by @Kreger51
– cookiecutter-django-rest-framework by @jpadilla
– cookiedozer by @hackebrot
The goals of this release were to add the ability to Jinja2ify the cookiecutter.json default values, and formally launch
support for Python 3.4.
Features:
• Python 3.4 is now a first class citizen, thanks to everyone.
• cookiecutter.json values are now rendered Jinja2 templates, thanks to @bollwyvl (#291).
• Move to py.test, thanks to @pfmoore (#319) and @ramiroluz (#310).
• Add PendingDeprecation warning for users of Python 2.6, as support for it is gone in Python 2.7, thanks to
@michaeljoseph (#201).
Bug Fixes:
• Corrected typo in Makefile, thanks to @inglesp (#297).
• Raise an exception when users don’t have git or hg installed, thanks to @pydanny (#303).
Other changes:
• Creation of gitter account for logged chat, thanks to @michaeljoseph.
• Added ReadTheDocs badge, thanks to @michaeljoseph.
• Added AppVeyor badge, thanks to @pydanny
• Documentation and PyPI trove classifier updates, thanks to @thedrow (#323 and #324)
The goal of this release was to allow for injection of extra context via the Cookiecutter API, and to fix minor bugs.
Features:
• cookiecutter() now takes an optional extra_context parameter, thanks to @michaeljoseph, @fcurella, @aven-
turella, @emonty, @schacki, @ryanolson, @pfmoore, @pydanny, @audreyr (#260).
• Context is now injected into hooks, thanks to @michaeljoseph and @dinopetrone.
• Moved all Python 2/3 compatibility code into cookiecutter.compat, making the eventual move to six easier,
thanks to @michaeljoseph (#60, #102).
• Added cookiecutterrc defined aliases for cookiecutters, thanks to @pfmoore (#246)
• Added flake8 to tox to check for pep8 violations, thanks to @natim.
Bug Fixes:
• Newlines at the end of files are no longer stripped, thanks to @treyhunner (#183).
• Cloning prompt suppressed by respecting the no\_input flag, thanks to @trustrachel (#285)
• With Python 3, input is no longer converted to bytes, thanks to @uranusjr (#98).
Other Changes:
• Added more Cookiecutters to the list:
– Python-iOS-template by @freakboy3742
– Python-Android-template by @freakboy3742
– cookiecutter-djangocms-plugin by @mishbahr
– cookiecutter-pyvanguard by @robinandeer
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 makedocs function, by @pydanny.
3.4. History 67
cookiecutter Documentation, Release 1.7.2
• Refactored contributing documentation, included adding core committer instructions, by @pydanny and @au-
dreyr.
• 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 @vincent-
bernat.
• 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:
– cookiecutter-kivy by @hackebrot
– BoilerplatePP by @Paspartout
– cookiecutter-pypackage-minimal by @borntyping
– cookiecutter-ansible-role by @iknite
– cookiecutter-pylibrary by @ionelmc
– cookiecutter-pylibrary-minimal by @ionelmc
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:
• Add more Cookiecutters to the list:
– cookiecutter-avr by @solarnz
– cookiecutter-tumblr-theme by @relekang
– cookiecutter-django-paas by @pbacterio
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 @ThomasChi-
roux. This is now always the default behavior. Prompts can also be suppressed 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 direc-
tory.
• 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.
3.4. History 69
cookiecutter Documentation, Release 1.7.2
• 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.
• Internal refactor to remove any code that changes the working directory.
• Only takes in one argument now: the input directory. The output directory is generated by rendering the name
of the input directory.
• Output directory cannot be the same as input directory.
• Takes in command line args for the input and output directories.
• Minor cleanup.
This showcase is where organizations can describe how they are using Cookiecutter.
3.5.1 BeeWare
Building Python tools for platforms like mobile phones and set top boxes requires a lot of boilerplate code just to get
the project running. Cookiecutter has enabled us to very quickly stub out a starter project in which running Python
code can be placed, and makes maintaining those templates very easy. With Cookiecutter we’ve been able to deliver
support Android devices, iOS devices, tvOS boxes, and we’re planning to add native support for iOS and Windows
devices in the future.
BeeWare is an organization building open source libraries for Python support on all platforms.
3.5.2 ChrisDev
Anytime we start a new project we begin with a Cookiecutter template that generates a Django/Wagtail project Our
developers like it for maintainability and our designers enjoy being able to spin up new sites using our tool chain very
quickly. Cookiecutter is very useful for because it supports both Mac OSX and Windows users.
ChrisDev is a Trinidad-based consulting agency.
3.5.3 OpenStack
3.6 Backers
We would like to thank the following people for supporting us in our efforts to maintain and improve Cookiecutter:
• Alex DeBrie
• Alexandre Y. Harano
• Bruno Alla
• Carol Willing
• Russell Keith-Magee
Everyone interacting in the Cookiecutter project’s codebases, issue trackers, chat rooms, and mailing lists is expected
to follow the PyPA Code of Conduct.
Index
• genindex
• modindex
73
cookiecutter Documentation, Release 1.7.2
74 Chapter 4. Index
Python Module Index
c
cookiecutter, 39
cookiecutter.cli, 29
cookiecutter.config, 29
cookiecutter.environment, 30
cookiecutter.exceptions, 30
cookiecutter.extensions, 32
cookiecutter.find, 32
cookiecutter.generate, 33
cookiecutter.hooks, 34
cookiecutter.log, 35
cookiecutter.main, 35
cookiecutter.prompt, 35
cookiecutter.replay, 37
cookiecutter.repository, 37
cookiecutter.utils, 38
cookiecutter.vcs, 39
cookiecutter.zipfile, 39
75
cookiecutter Documentation, Release 1.7.2
C D
determine_repo_dir() (in module cookiecut-
clone() (in module cookiecutter.vcs), 39
ter.repository), 37
command line option
dump() (in module cookiecutter.replay), 37
-config-file, 23
-debug-file, 23 E
-default-config, 23
ensure_dir_is_templated() (in module cook-
-directory, 23
iecutter.generate), 33
-no-input, 23
expand_abbreviations() (in module cookiecut-
-replay, 23
ter.repository), 38
77
cookiecutter Documentation, Release 1.7.2
L S
load() (in module cookiecutter.replay), 37 SlugifyExtension (class in cookiecut-
ter.extensions), 32
M StrictEnvironment (class in cookiecut-
make_executable() (in module cookiecutter.utils), ter.environment), 30
38
78 Index
cookiecutter Documentation, Release 1.7.2
U
UndefinedVariableInTemplate, 31
UnknownExtension, 31
UnknownRepoType, 31
UnknownTemplateDirException, 32
unzip() (in module cookiecutter.zipfile), 39
V
valid_hook() (in module cookiecutter.hooks), 34
validate_extra_context() (in module cook-
iecutter.cli), 29
VCSNotInstalled, 32
version_msg() (in module cookiecutter.cli), 29
W
work_in() (in module cookiecutter.utils), 39
Index 79