cruft
=====
One problem with cookiecutter templates is that projects based on older versions
of the template become obsolete when only the template is adapted to changing
requirements over time. `cruft `_ tries to
simplify the transfer of changes in the :doc:`Cookiecutter-Templates
`’s Git repository to projects derived from it.
The main features of cruft are:
* With ``cruft check`` you can quickly check if a project uses the latest
version of a template. This check can also be easily integrated into CI
pipelines to ensure that your projects are in sync.
* cruft also automates the update of projects from cookiecutter templates.
Installation
------------
.. code-block:: console
$ python -m pip install cruft
Create a new project
--------------------
To create a new project with cruft, you can run :samp:`cruft create
{PROJECT_URL}` on the command line, for example:
.. code-block:: console
$ cruft create https://github.com/veit/cookiecutter-namespace-template
full_name [Veit Schiele]:
…
cruft uses :doc:`Cookiecutter ` for this and the only difference in
the resulting output is a :file:`.cruft.json` file that contains the git hash of
the template used as well as the specified parameters.
.. tip::
Certain files are rarely suitable for updating, for example test cases or
:file:`__init__` files. You can tell cruft to always skip updating these
files in a project by creating the project with the arguments
:samp:`--skip vsc/__init__.py --skip tests` or manually adding them to a
skip section in your :file:`.cruft.json` file:
.. code-block:: javascript
:emphasize-lines: 4-7
{
"template": "https://github.com/veit/cookiecutter-namespace-template",
"commit": "521d4b2aa603aec186cd7e542295edb458ba4552",
"skip": [
"vsc/__init__.py",
"tests"
],
"checkout": null,
"context": {
"cookiecutter": {
"full_name": "Veit Schiele",
...
}
},
"directory": null
}
Updating a project
------------------
To update an existing project that was created with cruft, you can run ``cruft
update`` in the root directory of the project. If there are updates, cruft will
first ask you to review them. If you accept the changes, cruft will apply them
to your project and update the :file:`.cruft.json` file.
Checking a project
------------------
To see if a project has missed a template update, you can easily call ``cruft
check``. If the project is out of date, an error and exit code 1 will be
returned. ``cruft check`` can also be added to
:doc:`Python4DataScience:productive/git/advanced/hooks/pre-commit` and CI
pipelines to ensure projects don’t become unintentionally stale.
Linking an existing project
---------------------------
If you have an existing project that you created in the past with Cookiecutter
directly from a template, you can :samp:`cruft link {TEMPLATE_REPOSITORY}` to
link it to the template it was created with, for example:
.. code-block:: console
$ cruft link https://github.com/veit/cookiecutter-namespace-template
You can then specify the last commit of the template that updated the project,
or accept the default to use the last commit.
Show diff
---------
Over time, your project may differ greatly from the actual cookiecutter
template. ``cruft diff`` allows you to quickly see what has changed in your
local project compared to the template.