Skip to content

Commit 1eb959a

Browse files
committed
clean up cookiecutter; add babelizer_environment function
1 parent 3b10450 commit 1eb959a

File tree

3 files changed

+55
-36
lines changed

3 files changed

+55
-36
lines changed

babelizer/_cookiecutter.py

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import os
4+
from collections.abc import Iterable
45
from datetime import datetime
56
from typing import Any
67

@@ -9,20 +10,19 @@
910
from jinja2 import StrictUndefined
1011
from jinja2 import Template
1112

13+
from babelizer._datadir import get_template_dir
1214
from babelizer._post_hook import run
1315
from babelizer._utils import as_cwd
1416

1517

1618
def cookiecutter(
1719
template: str,
18-
extra_context: dict[str, Any] | None = None,
20+
context: dict[str, Any] | None = None,
1921
output_dir: str = ".",
20-
no_input: bool = True,
21-
overwrite_if_exists: bool = False,
2222
) -> None:
23-
if extra_context is None:
24-
extra_context = {}
25-
env = Environment(loader=FileSystemLoader(template), undefined=StrictUndefined)
23+
if context is None:
24+
context = {}
25+
env = babelizer_environment(template)
2626

2727
def datetime_format(value: datetime, format_: str = "%Y-%M-%D") -> str:
2828
return value.strftime(format_)
@@ -31,30 +31,62 @@ def datetime_format(value: datetime, format_: str = "%Y-%M-%D") -> str:
3131

3232
for dirpath, _dirnames, filenames in os.walk(template):
3333
rel_path = os.path.relpath(dirpath, template)
34-
target_dir = os.path.join(output_dir, render_path(rel_path, extra_context))
34+
target_dir = os.path.join(output_dir, render_path(rel_path, context))
3535

3636
if not os.path.exists(target_dir):
3737
os.makedirs(target_dir)
3838

3939
for filename in filenames:
40-
target_path = os.path.join(target_dir, render_path(filename, extra_context))
40+
target_path = os.path.join(target_dir, render_path(filename, context))
4141

4242
with open(target_path, "w") as fp:
4343
fp.write(
44-
env.get_template(os.path.join(rel_path, filename)).render(
45-
**extra_context
46-
)
44+
env.get_template(os.path.join(rel_path, filename)).render(**context)
4745
)
4846

4947
with as_cwd(output_dir):
50-
run(extra_context)
51-
52-
53-
def render_path(path: str, context: dict[str, Any]) -> str:
54-
rendered_path = Template(path).render(**context)
48+
run(context)
49+
50+
51+
def babelizer_environment(template: str | None = None) -> Environment:
52+
if template is None:
53+
template = get_template_dir()
54+
55+
return Environment(loader=FileSystemLoader(template), undefined=StrictUndefined)
56+
57+
58+
def render_path(
59+
path: str,
60+
context: dict[str, Any],
61+
remove_extension: Iterable[str] = (".jinja", ".jinja2", ".j2"),
62+
) -> str:
63+
"""Render a path as though it were a jinja template.
64+
65+
Parameters
66+
----------
67+
path : str
68+
A path.
69+
context : dict
70+
Context to use for substitution.
71+
remove_extension : iterable of str, optional
72+
If the provided path ends with one of these exensions,
73+
the extension will be removed from the rendered path.
74+
75+
Examples
76+
--------
77+
>>> from babelizer._cookiecutter import render_path
78+
>>> render_path("{{foo}}.py", {"foo": "bar"})
79+
'bar.py'
80+
>>> render_path("{{foo}}.py.jinja", {"foo": "bar"})
81+
'bar.py'
82+
>>> render_path("bar.py.j2", {"foo": "bar"})
83+
'bar.py'
84+
>>> render_path("{{bar}}.py.jinja", {"foo": "bar"})
85+
Traceback (most recent call last):
86+
...
87+
jinja2.exceptions.UndefinedError: 'bar' is undefined
88+
"""
89+
rendered_path = Template(path, undefined=StrictUndefined).render(**context)
5590

5691
root, ext = os.path.splitext(rendered_path)
57-
if ext == ".jinja":
58-
rendered_path = root
59-
60-
return rendered_path
92+
return rendered_path if ext not in remove_extension else root

babelizer/_files/readme.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,10 @@
22

33
from typing import Any
44

5-
from jinja2 import Environment
6-
from jinja2 import FileSystemLoader
7-
from jinja2 import StrictUndefined
8-
9-
from babelizer._datadir import get_template_dir
5+
from babelizer._cookiecutter import babelizer_environment
106

117

128
def render(context: dict[str, Any]) -> str:
13-
env = Environment(
14-
loader=FileSystemLoader(get_template_dir()), undefined=StrictUndefined
15-
)
16-
template = env.get_template("templates/README.rst")
9+
template = babelizer_environment().get_template("README.rst")
1710

1811
return template.render(**context)

babelizer/render.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,7 @@ def render(
7171
if os.path.exists(output):
7272
raise OutputDirExistsError(output)
7373

74-
cookiecutter(
75-
template,
76-
extra_context=context,
77-
output_dir=output,
78-
no_input=True,
79-
overwrite_if_exists=clobber,
80-
)
74+
cookiecutter(template, context=context, output_dir=output)
8175

8276
path = os.path.realpath(output)
8377

0 commit comments

Comments
 (0)