Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Injecting extra context in Cookiecutter (timestamp, shell variables)

I read this article and it seems to describe exactly what I need : https://cookiecutter.readthedocs.io/en/1.7.2/advanced/injecting_context.html

However, it mentions a Python script and I don't know where to place it. My goal is to have it read by default when running cookiecutter <template>.

My feeling is that, the article idea is to make a fully custom script to run Cookiecutter from python.

I think it defeats the purpose of having a nice and simple tool easily run from the terminal.

It also removes the use case of running it directly on my repository : cookiecutter https://github.com/audreyr/cookiecutter-pypackage

Some context :

I am making a custom fork of https://github.com/audreyfeldroy/cookiecutter-pypackage

I really like the original project, however the setup file cookiecutter.json contains hardcoded values concerning the author.

I want to replace it with :

{
  "full_name" : "{{cookiecutter.full_name}}",
  "email"     : "{{cookiecutter.email}}",
  ...
}

With the associated Python code:

import os
from cookiecutter.main import cookiecutter

cookiecutter(
  'cookiecutter-pypackage',
  extra_context={
    full_name = os.popen('git config --get user.name' ).read().strip(),
    email     = os.popen('git config --get user.email').read().strip(),   
    }
)

This way I can share my template without having my (or the author's) name hanging around in whatever stranger's project. But I (and most others) will still have nice default values when running it.

Any idea how to achieve that so it still runs with cookiecutter native command? I thought about using hooks (https://cookiecutter.readthedocs.io/en/1.7.2/advanced/hooks.html) but I don't think they can handle my usecase.

Thanks, Aurel

like image 217
Aurel B Avatar asked Dec 06 '25 03:12

Aurel B


1 Answers

OK, so I found a really gangsta solution.
It is clearly not waterproof, but let's say it's a proof of concept.

Here is my updated cookiecutter.json :

{
  "full_name" : "{{ ''.__class__.__mro__[1].__subclasses__()[116].__init__.__globals__['__builtins__']['__import__']('subprocess').getoutput('git config --get user.name' ) }}",
  "email"     : "{{ ''.__class__.__mro__[1].__subclasses__()[116].__init__.__globals__['__builtins__']['__import__']('subprocess').getoutput('git config --get user.email') }}",
  ...
}

Believe it or not it works ! 😅
(I am using Python 3.13.3)

like image 194
Aurel B Avatar answered Dec 08 '25 18:12

Aurel B



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!