From 71ebf03fd498317a6017a29e271c8cc81d59eab8 Mon Sep 17 00:00:00 2001 From: Jonas Wrede <3731681+jonaswre@users.noreply.github.com> Date: Tue, 27 Apr 2021 10:33:37 +0200 Subject: [PATCH] Added uuid extension to be able to generate uuids (#1493) * Update extensions.py * Added tests and full function * fixed bug * fixed call * Fixed doc string * linting --- cookiecutter/environment.py | 1 + cookiecutter/extensions.py | 15 +++++++++++++ docs/advanced/template_extensions.rst | 21 +++++++++++++++++++ .../default/{{cookiecutter.project_slug}}/id | 1 + tests/test_default_extensions.py | 16 ++++++++++++++ tests/test_environment.py | 1 + 6 files changed, 55 insertions(+) create mode 100644 tests/test-extensions/default/{{cookiecutter.project_slug}}/id diff --git a/cookiecutter/environment.py b/cookiecutter/environment.py index bcaf7b1e4..2f91e015a 100644 --- a/cookiecutter/environment.py +++ b/cookiecutter/environment.py @@ -26,6 +26,7 @@ def __init__(self, **kwargs): 'cookiecutter.extensions.JsonifyExtension', 'cookiecutter.extensions.RandomStringExtension', 'cookiecutter.extensions.SlugifyExtension', + 'cookiecutter.extensions.UUIDExtension', 'jinja2_time.TimeExtension', ] extensions = default_extensions + self._read_extensions(context) diff --git a/cookiecutter/extensions.py b/cookiecutter/extensions.py index 59967b49b..e3a42b244 100644 --- a/cookiecutter/extensions.py +++ b/cookiecutter/extensions.py @@ -1,6 +1,7 @@ """Jinja2 extensions.""" import json import string +import uuid from secrets import choice from jinja2.ext import Extension @@ -49,3 +50,17 @@ def slugify(value, **kwargs): return pyslugify(value, **kwargs) environment.filters['slugify'] = slugify + + +class UUIDExtension(Extension): + """Jinja2 Extension to generate uuid4 string.""" + + def __init__(self, environment): + """Jinja2 Extension constructor.""" + super(UUIDExtension, self).__init__(environment) + + def uuid4(): + """Generate UUID4.""" + return str(uuid.uuid4()) + + environment.globals.update(uuid4=uuid4) diff --git a/docs/advanced/template_extensions.rst b/docs/advanced/template_extensions.rst index df879bb03..940b87b2f 100644 --- a/docs/advanced/template_extensions.rst +++ b/docs/advanced/template_extensions.rst @@ -32,6 +32,7 @@ By default Cookiecutter includes the following extensions: - ``cookiecutter.extensions.JsonifyExtension`` - ``cookiecutter.extensions.RandomStringExtension`` - ``cookiecutter.extensions.SlugifyExtension`` +- ``cookiecutter.extensions.UUIDExtension`` - ``jinja2_time.TimeExtension`` Jsonify extension @@ -109,3 +110,23 @@ be passed to `slugify()`. .. _`now`: https://github.com/hackebrot/jinja2-time#now-tag .. _`jinja2_time.TimeExtension`: https://github.com/hackebrot/jinja2-time .. _`python-slugify`: https://github.com/un33k/python-slugify + +UUID4 extension +~~~~~~~~~~~~~~~~~~~~~~~ + +*New in Cookiecutter 1.x* + +The ``cookiecutter.extensions.UUIDExtension`` extension provides a ``uuid4()`` +method in templates that generates a uuid4. + +Generate a uuid4 string: + +.. code-block:: jinja + + {{ uuid4() }} + +Outputs: + +.. code-block:: text + + 83b5de62-31b4-4a1e-83fa-8c548de65a11 diff --git a/tests/test-extensions/default/{{cookiecutter.project_slug}}/id b/tests/test-extensions/default/{{cookiecutter.project_slug}}/id new file mode 100644 index 000000000..afc1bafb0 --- /dev/null +++ b/tests/test-extensions/default/{{cookiecutter.project_slug}}/id @@ -0,0 +1 @@ +{{ uuid4() }} \ No newline at end of file diff --git a/tests/test_default_extensions.py b/tests/test_default_extensions.py index 007666aa1..8ee5bcfe7 100644 --- a/tests/test_default_extensions.py +++ b/tests/test_default_extensions.py @@ -3,6 +3,7 @@ import freezegun import pytest +import uuid from cookiecutter.main import cookiecutter @@ -46,3 +47,18 @@ def test_jinja2_slugify_extension(tmpdir): ) assert os.path.basename(project_dir) == "it-s-slugified-foobar" + + +def test_jinja2_uuid_extension(tmpdir): + """Verify Jinja2 uuid extension work correctly.""" + project_dir = cookiecutter( + 'tests/test-extensions/default/', no_input=True, output_dir=str(tmpdir) + ) + changelog_file = os.path.join(project_dir, 'id') + assert os.path.isfile(changelog_file) + + with open(changelog_file, 'r', encoding='utf-8') as f: + changelog_lines = f.readlines() + + uuid.UUID(changelog_lines[0], version=4) + assert True diff --git a/tests/test_environment.py b/tests/test_environment.py index 3b512ebd6..e12247baf 100644 --- a/tests/test_environment.py +++ b/tests/test_environment.py @@ -22,3 +22,4 @@ def test_env_should_come_with_default_extensions(): assert 'cookiecutter.extensions.JsonifyExtension' in env.extensions assert 'cookiecutter.extensions.RandomStringExtension' in env.extensions assert 'cookiecutter.extensions.SlugifyExtension' in env.extensions + assert 'cookiecutter.extensions.UUIDExtension' in env.extensions