Skip to content

Commit

Permalink
feat: allow templating _answers_file setting (#1027)
Browse files Browse the repository at this point in the history
Co-authored-by: Ethan Barker <ethanbarker0@gmail.com>
  • Loading branch information
icj217 and EthanBar authored Mar 25, 2023
1 parent 2e21b3f commit d2de535
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
4 changes: 3 additions & 1 deletion copier/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,9 @@ def answers_relpath(self) -> Path:
2. Template default.
3. Copier default.
"""
return self.answers_file or self.template.answers_relpath
path = self.answers_file or self.template.answers_relpath
template = self.jinja_env.from_string(str(path))
return Path(template.render(**self.answers.combined))

@cached_property
def all_exclusions(self) -> StrSeq:
Expand Down
74 changes: 74 additions & 0 deletions tests/test_answersfile_templating.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import pytest

import copier
from copier.user_data import load_answersfile_data

from .helpers import build_file_tree


@pytest.fixture(scope="module")
def template_path(tmp_path_factory) -> str:
root = tmp_path_factory.mktemp("template")
build_file_tree(
{
root
/ "{{ _copier_conf.answers_file }}.jinja": """\
# Changes here will be overwritten by Copier
{{ _copier_answers|to_nice_yaml }}
""",
root
/ "copier.yml": """\
_answers_file: ".copier-answers-{{ module_name }}.yml"
module_name:
type: str
""",
}
)
return str(root)


@pytest.mark.parametrize("answers_file", [None, ".changed-by-user.yml"])
def test_answersfile_templating(template_path, tmp_path, answers_file):
"""
Test copier behaves properly when _answers_file contains a template
Checks that template is resolved successfully and that a subsequent
copy that resolves to a different answers file doesn't clobber the
old answers file.
"""
copier.copy(
template_path,
tmp_path,
{"module_name": "mymodule"},
answers_file=answers_file,
defaults=True,
overwrite=True,
)
first_answers_file = (
".copier-answers-mymodule.yml"
if answers_file is None
else ".changed-by-user.yml"
)
assert (tmp_path / first_answers_file).exists()
answers = load_answersfile_data(tmp_path, first_answers_file)
assert answers["module_name"] == "mymodule"

copier.copy(
template_path,
tmp_path,
{"module_name": "anothermodule"},
defaults=True,
overwrite=True,
)

# Assert second one created
second_answers_file = ".copier-answers-anothermodule.yml"
assert (tmp_path / second_answers_file).exists()
answers = load_answersfile_data(tmp_path, second_answers_file)
assert answers["module_name"] == "anothermodule"

# Assert first one still exists
assert (tmp_path / first_answers_file).exists()
answers = load_answersfile_data(tmp_path, first_answers_file)
assert answers["module_name"] == "mymodule"

0 comments on commit d2de535

Please sign in to comment.