mirror of
https://github.com/copier-org/copier.git
synced 2025-05-05 23:42:55 +00:00
* Refactor * Fix #110. * Rewrite test_config_exclude, test_config_exclude_overridden and test_config_include. These tests were badly designed, using a monkeypatch that would never happen in the real world, and actually producing false positives. I moved them to test_exclude.py and rewritten to test the what and not the how. * Fix #214 by removing skip option. Relevant tests use the better skip_if_exists=["**"]. * Remove subdirectory flag from API/CLI. It was confusing and could lead to bad maintenance situations. Fixes #315. * Remove extra_paths and fix #321 * Remember that you cannot use _copier_conf.src_path as a path now * use dataclasses * Create errors module, simplify some tests, fix many others * Fix some tests, complete EnvOps removal * Fix #214 and some tests related to it * Reorder code * Update docs and imports * Modularize test_complex_questions * Interlink worker and questionary a bit better * Removal of Questionary class, which only had 1 meaningful method that is now merged into Worker to avoid circular dependencies. * Fix #280 in a simple way: only user answers are type-casted inside API, and CLI transforms all `--data` using YAML always. Predictable. * Use prereleases correctly. * Reorder AnswersMap to have a more significative repr. * Simpler cache for old `Question.get_choices()` method (renamed now). * fix wrong test * Fix test_subdirectory * Fix test_tasks (and remove tests/demo_tasks) * Fix path filter tests, and move it to test_exclude, where it belongs * Make test_config pass * Fix more wrongly designed tests * Use cached_property backport if needed * xfail test known to fail on mac * force posix paths on windows * Add typing_extensions for python < 3.8 * Sort dependencies in pyproject.toml * Support python 3.6 str-to-datetime conversion * Workaround https://bugs.python.org/issue43095 * xfail test_path_filter on windows * Upgrade mkdocs and other dependencies to fix https://github.com/pawamoy/mkdocstrings/issues/222 * Add missing reference docs. * Add workaround for https://github.com/pawamoy/mkdocstrings/pull/209 * Docs. * Remove validators module * Add workaround for https://github.com/pawamoy/mkdocstrings/issues/225 * Restore docs autorefs as explained in https://github.com/pawamoy/mkdocstrings/issues/226#issuecomment-775413562. * Workaround https://github.com/pawamoy/pytkdocs/issues/86
112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
from textwrap import dedent
|
|
|
|
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 ]].tmpl": """\
|
|
# Changes here will be overwritten by Copier
|
|
[[ _copier_answers|to_nice_yaml ]]
|
|
""",
|
|
root
|
|
/ "copier.yml": """\
|
|
_answers_file: .answers-file-changed-in-template.yml
|
|
|
|
round: 1st
|
|
|
|
# A str question without a default should default to None
|
|
str_question_without_default:
|
|
type: str
|
|
|
|
# password_1 and password_2 must not appear in answers file
|
|
_secret_questions:
|
|
- password_1
|
|
|
|
password_1: password one
|
|
password_2:
|
|
secret: yes
|
|
default: password two
|
|
""",
|
|
root
|
|
/ "round.txt.tmpl": """\
|
|
It's the [[round]] round.
|
|
password_1=[[password_1]]
|
|
password_2=[[password_2]]
|
|
""",
|
|
}
|
|
)
|
|
return str(root)
|
|
|
|
|
|
@pytest.mark.parametrize("answers_file", [None, ".changed-by-user.yaml"])
|
|
def test_answersfile(template_path, tmp_path, answers_file):
|
|
"""Test copier behaves properly when using an answersfile."""
|
|
round_file = tmp_path / "round.txt"
|
|
|
|
# Check 1st round is properly executed and remembered
|
|
copier.copy(template_path, tmp_path, answers_file=answers_file, force=True)
|
|
answers_file = answers_file or ".answers-file-changed-in-template.yml"
|
|
assert (
|
|
round_file.read_text()
|
|
== dedent(
|
|
"""
|
|
It's the 1st round.
|
|
password_1=password one
|
|
password_2=password two
|
|
"""
|
|
).lstrip()
|
|
)
|
|
log = load_answersfile_data(tmp_path, answers_file)
|
|
assert log["round"] == "1st"
|
|
assert log["str_question_without_default"] is None
|
|
assert "password_1" not in log
|
|
assert "password_2" not in log
|
|
|
|
# Check 2nd round is properly executed and remembered
|
|
copier.copy(
|
|
template_path, tmp_path, {"round": "2nd"}, answers_file=answers_file, force=True
|
|
)
|
|
assert (
|
|
round_file.read_text()
|
|
== dedent(
|
|
"""
|
|
It's the 2nd round.
|
|
password_1=password one
|
|
password_2=password two
|
|
"""
|
|
).lstrip()
|
|
)
|
|
log = load_answersfile_data(tmp_path, answers_file)
|
|
assert log["round"] == "2nd"
|
|
assert log["str_question_without_default"] is None
|
|
assert "password_1" not in log
|
|
assert "password_2" not in log
|
|
|
|
# Check repeating 2nd is properly executed and remembered
|
|
copier.copy(template_path, tmp_path, answers_file=answers_file, force=True)
|
|
assert (
|
|
round_file.read_text()
|
|
== dedent(
|
|
"""
|
|
It's the 2nd round.
|
|
password_1=password one
|
|
password_2=password two
|
|
"""
|
|
).lstrip()
|
|
)
|
|
log = load_answersfile_data(tmp_path, answers_file)
|
|
assert log["round"] == "2nd"
|
|
assert log["str_question_without_default"] is None
|
|
assert "password_1" not in log
|
|
assert "password_2" not in log
|